왜 저자는 하필 private static으로 중첩시키자고 하는지 궁금합니다.
class DefaultMemberService implements MemberService {
private String name;
private static class PrivateStaticClass { // private static inner class
}
private class PrivateClass { // inner class
}
}
차이를 살펴보면 inner PrivateClass는 PrivateClass를 감싸고있는 DefaultMemberService의 인스턴스를 참조합니다. 하지만 inner PrivateStaticClass는 inner 클래스이지만 독립적인거나 마찬가지 입니다. 따라서 PrivateStaticClass는 DefaultMemberService인스턴스의 참조가 없습니다.
public static void main(String[] args) {
Arrays.stream(PrivateClass.class.getDeclaredFields()).forEach(System.out::println);
}
실행결과
final me.whiteship.chapter04.item15.class_and_interfaces.member.DefaultMemberService me.whiteship.chapter04.item15.class_and_interfaces.member.DefaultMemberService$PrivateClass.this$0
Privateclass의 필드를 출력해보면 DefaultMemberService가 출력되는것을 확인할 수 있습니다.
class DefaultMemberService implements MemberService {
private String name;
private static class PrivateStaticClass { // private static inner class
void doPrint() {
System.out.println(name); // 불가능
}
}
private class PrivateClass { // inner class
void doPrint() {
System.out.println(name);
}
}
}
PrivateClass는 DefaultMemberService의 인스턴스를 참조하기때문에 name을 PrivateClass내에 doPrint메서드에서 자연스럽게 쓸 수 있습니다. PrivateStaticClass는 불가능 합니다. DefaultMemberService에서만 사용되는 inner클래스이지만 본질은 독립적인 클래스입니다. 따라서 참조를 갖는 PrivateClass보다는 독립적인 PrivateStaticClass가 DefaultMemberService와 관계가 단순해지고 더 적합해 보입니다.