나는 생성자에 인자로 루프를 통과 할 수있다

angz :

나는 인수 모든 생성자의 요구를 포함하는 배열 목록을 가지고있다. 배열의 각 항목을 참조하여 다음 인수를 제공하는 별도의 작업을 많이처럼 보인다. 나는 생성자의 괄호 안에 그것을 통해 반복하여 배열 목록의 각 항목을 통과 할 수 있는지 궁금합니다.

내가 인수를 전달하는 비슷한이 작업을 수행, 또는 수 있는지 부탁 해요.

constructor object =new constructor(for(String item: parts));

부품 여기 어레이리스트이다. 그리고 목록의 모든 항목은 문자열입니다.

bobah :

전자는 혼란 스러울 수 있으므로 // 나는, "MyClass에"를 "생성자"클래스 이름을 바꾼

이 작업을 수행하는 자바에서 직접 구문은 없습니다. 그러나 공장의 도움으로 당신이 뭔가를 같이 얻을 수 있습니다 :

final String[] args = {"one", "two", "three"};
final MyClass obj = newMyClass(args); // effect of new Constructor(args[0], args[1], args[2])
final MyClass obj = newMyClass(args[0], args[1], args[2]); // works too, thanks to the variadic declaration syntax

당신이 주석 프로세서 기반의 코드 생성과 중, 공장이 필요하거나 sun.misc.Unsafe의 도움으로 응용 프로그램 초기화시에 건설 것이라는 점을 들어 (이 일부 고성능 시리얼 라이저가 어떻게 BTW)입니다.

예:

package net.bobah.uf4j;

import org.junit.Test;
import sun.misc.Unsafe;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiConsumer;

import static java.lang.System.out;
import static net.bobah.uf4j.MyTest.MyClassFactory.newMyClass;

public class MyTest {

    @Test
    public void runTest() throws Exception {
        final MyClass ctor = newMyClass("one", "two", "three");
        out.println(Arrays.asList(ctor.str1, ctor.str2, ctor.str3));
        // prints [one, two, three]
    }

    public static class MyClass {
        private final String str1;
        private final String str2;
        private final String str3;

        public MyClass(String str1, String str2, String str3) {
            this.str1 = str1;
            this.str2 = str2;
            this.str3 = str3;
        }

    }

    public static class MyClassFactory {
        private static Unsafe getUnsafe() {
            try {
                Field f = Unsafe.class.getDeclaredField("theUnsafe");
                f.setAccessible(true);
                return (Unsafe) f.get(null);
            } catch (IllegalAccessException | NoSuchFieldException cause) {
                throw new RuntimeException(cause);
            }
        }

        private static final Unsafe unsafe = getUnsafe();

        private static final List<BiConsumer<MyClass, String>> fieldInitializers = new ArrayList<>();

        static {
            // this can be extended to support one-to-many mappings from args to fields, or to do type transformation on the way
            for (Field field : MyClass.class.getDeclaredFields()) {
                if (String.class.equals(field.getType())) {
                    final long offset = unsafe.objectFieldOffset(field);
                    fieldInitializers.add((obj, val) -> {
                        unsafe.putObject(obj, offset, val);
                    });
                }
            }
        }

        public static MyClass newMyClass(String... args) throws InstantiationException {
            assert args.length == fieldInitializers.size();

            // create uninitialized instance
            final MyClass obj = (MyClass) unsafe.allocateInstance(MyClass.class);

            // inject final fields
            for (int i = 0; i < args.length; ++i) {
                fieldInitializers.get(i).accept(obj, args[i]);
            }

            return obj;
        }
    }

}

추천

출처http://43.154.161.224:23101/article/api/json?id=182382&siteId=1