이 getAllFields
구현은 엄청나게 비효율적이어서 여러 개의 ArrayList
인스턴스와 배열을 만들고 그 사이에서 전체 데이터를 반복적으로 복사합니다. 다행스럽게도 클래스 계층 구조가 그다지 깊지 않기 때문에 이것이 병목 현상이됩니다.
그래도, 당신은 간단하고 효율적인 직선 앞으로 루프, 이것을 구현할 수 있습니다 여기에 재귀를 사용에서 조금 이득이 없다
public static Field[] getAllFields(Class<?> klass) {
List<Field> fields = new ArrayList<>();
for(; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
return fields.toArray(new Field[0]);
}
.
루프와
, 당신은 쉽게 당신이 정말로 원하는 경우 Function
를 만들 수 있습니다
이
public void init(){
Function<Class<?>,Field[]> f = klass -> {
List<Field> fields = new ArrayList<>();
for(; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
return fields.toArray(new Field[0]);
};
Field[] someFields = f.apply(SomeClass.class);
}
비록 물론, 심지어 전혀 Function
에 루프를 넣어 이유가 없습니다. 여기서 비효율적 인 구현을 사용하고자하기 때문에 여기에 함수가 있기를 원하지만 람다 식에서는 전혀 액세스하지 못합니다. 그들은 필드에 액세스 할 수 있으며, 기능 인터페이스를 구현하는 인스턴스는 인데,이 필드가 인 경우 원하지 않는 필드에 저장됩니다. 로컬 람다 표현식을 사용하면 재귀를 수행 할 수 없습니다. 직진 루프와
, 당신은 단지 생각
public void init(){
List<Field> fields = new ArrayList<>();
for(Class<?> klass=SomeClass.class; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
Field[] someFields = fields.toArray(new Field[0]);
}
을 쓸 수 있습니다, 실제로 배열로 fields
의 내용을 복사하는 진짜 이유는 거의 없다, 당신은 단지 대신 List<Field>
와 함께 일할 수 .
즉, getAllFields
과 같은 목적을 설명하는 명명 된 메서드에 루프를 캡슐화하는 것은 실제로 좋은 방법입니다. 노출시키지 않으려면 public
대신 private
을 선언하십시오.
목표는 무엇입니까? 코드를 난독 화합니까? 람다 (lambda)를 사용하는 것이 유용한 경우가 많이 있지만, 실제로는 이들 중 하나가 아닙니다. –
뭘 시도했는지 보여주고 문제가 무엇인지 설명해주십시오. – shmosel
나는 동의하지 않는다. 일단 전체 코드 로직이 1 개의 메소드 안에 캡슐화되면, 훨씬 더 유지 보수가 가능하다. – Benma