Effective Java Reloaded
참조: Parleys.com에서 Effective Java Reloaded
Generic
- PECS, Producer extends, Consumer super.
- 타입제한으로 인해 다형성같은 유연함이 떨어질 땐, PECS를 적용하면 유연하게 만들 수 있다.
Enum
- int 값을 얻고 싶을 때 ordinal()+1 을 반환하는건 유지보수 힘들다.(순서 바뀔 수도 있고, 중간 요소가 빠져있을 수도 있고, 같은 수를 반환할 수가 없다.)
- int 속성을 enum 생성자에 전달하고 그 값을 반환하도록 코딩한다.(오.. 멋지다.)
public enum Ensemble {
SOLO(1), DUET(2), TRIO(3), ...
private final int numberOfMusicians;
Ensemble(int size){
numberOfMusicians = size;
}
public int numberOfMusicians() {
return numberOfMusicians;
}
}
- int 상수 사용 문제. not typesafe, no namespace, brittle, 출력시 값이 명시적이지가 않아, 순회하기도 힘들어, 64비트 넘으면 ㄷㄷㄷ
- EnumSet을 enum이 가지고 있는 메소드에 넘긴다.
public void applyStyles(Set<Style> styles) {...}
text.applyStyles(EnumSEt.of(Style.BOLD, Style.ITALIC));
- ordinal()은 EnumSet, EnumMap 같은 곳에서 내부적으로 사용할 목적이니까, 프로그래밍 할 땐 쓰지 말도록.
- 싱글톤 퀴즈, enum으로 싱글톤 만들기
Serializable Singleton
public enum Elvis {
INSTANCE;
...
}
- enum 제약 사항
확장 못 한다. 메소드는 인터페이스를 사용해서 확장 가능
Emulated Extensible Enum
Lazy initialization
- 언제 사용하는가
성능, initialization circularity 해결하려고
- static 필드는 Holder Class 사용하기
private static class FiledHolder {
static final FieldType field = computeFirldValue();
}
static FieldType getField(){
return FieldHolder.field;
}
- 인스턴스 필드는 더블 체킹
private volatile FieldType field;
FieldType getField(){
FieldType result = field;
if(result == null){ // 1st check (no lock)
synchronized(this){
result = field;
if(result == null) // 2nd check (w/ lock)
field = result = computeFieldValue();
}
}
return result;
}