이펙티브 자바, 아이템 24 - 멤버 클래스는 되도록 static으로 만들라
public class Outer {
private final int data;
public Outer(final int data) {
this.data = data;
}
public static class PublicStaticInner {
public void run() {
System.out.println(this);
System.out.println(CONST); // 접근 가능
System.out.println(data); // 컴파일 에러
}
}
private static class PrivateStaticInner {
public void run() {
System.out.println(this);
System.out.println(CONST); // 접근 가능
System.out.println(Outer.this.data); // 컴파일 에러
}
}
}
Outer 클래스의 static 멤버에만 접근할 수 있다
@Test
void test() {
new Outer.PublicStaticInner();
Outer outer = new Outer(10);
outer.new PublicStaticInner(); // 컴파일 에러
}
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
// ...
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
//...
}
// ...
}
public class Outer {
private final static int CONST = 10;
private final int data;
public Outer(final int data) {
this.data = data;
}
public class PublicInner {
public void run() {
System.out.println(this);
System.out.println(CONST);
System.out.println(data);
}
}
private class PrivateInner {
public void run() {
System.out.println(this);
System.out.println(CONST);
System.out.println(data);
}
}
}
@Test
void test() {
Outer outer = new Outer(10);
outer.new PublicInner();
new Outer.PublicInner().; // 컴파일 에러
}
Outer 클래스의 인스턴스
.new InnerCalss()
를 사용하여 직접 인스턴스를 생성하던가,public class Outer {
// ...
public void userInnerClass() {
PrivateInner privateInner = new PrivateInner();
privateInner.run();
}
// ...
}
Inner 클래스의 인스턴스
와 Outer 클래스의 인스턴스
의 관계는 Inner 클래스가 인스턴스화 될 때 확립되고 이를 추후에 변경할 수 없다.되도록이면 멤버 클래스에서는
static
을 사용하자
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
// ...
final class KeySet extends AbstractSet<K> {
// ...
}
// ...
final class Values extends AbstractCollection<V> {
// ...
}
// ...
final class EntrySet extends AbstractSet<Map.Entry<K, V>> {
// ...
}
// ...
}
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
// ...
private class Itr implements Iterator<E> {
// ...
}
// ...
}
선언
과 인스턴스 생성
을 한다.