익명 클래스: 클래스 선언과 인스턴스화를 바로 동시에 할 수 있다 바로 즉석으로 필요한 객체생성과 구현을 할 수 있다
아래 코드는 Spring Batch의 ItemWriter이다
public interface ItemWriter<T> {
void write(List<? extends T> var1) throws Exception;
}
@StepScope
@Bean
public ItemWriter<String> plainTextWriter(){
return new ItemWriter<String>() {
@Override
public void write(List<? extends String> items) throws Exception {
for (String item : items) {
System.out.println(item);
}
}
};
}
이렇게 ItemWriter의 write 메서드를 익명 클래스로 사용해서 할 수 있다 저 인스턴스는 이름이 없다 그리고 코드도 길다
이거를 람다로 대체할 수 있다
@StepScope
@Bean
public ItemWriter<String> plainTextWriter(){
return items -> {
items.forEach(System.out::println);
};
}
일단 간결하다 그리고 람다의 매개변수 타입은 코드에서 언급되지않고 컴파일러가 문맥을 보고 타입을 추론한다
하지만 람다또한 이름이 없고 문서화를 못한다 람다 코드가 길어지면 동작이 정확하게 보이지 않아서 가독성도 떨어지기 때문에 3줄 이하에 사용하는게 적절하다고 한다
그리고 추상 클래스의 인스턴스를 만들 때 람다를 쓸 수 없기때문에 익명 클래스를 사용해야 한다
또한 람다에서 this키워드는 익명 클래스의 인스턴스 자신을 가르킨다 함수 객체가 자신을 참조하면 익명클래스를 사용해야 한다