제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



java enum - 보충

본 내용은 Paleys.com 에 있는 Joshua bloch의 Effective java reload 동영상을 바탕으로 쓴 글입니다.

eunm에 대한 기본 지식이 없다면 이전에 정리해 놓은 글들을 먼저 보시고 보시는 게 좋을 듯합니다.

1. ordinal

enum에는 ordinal() 메쏘드가 있는데, 이 것은 각 element의 순서대로 번호가 생깁니다. 따라서 몇 번째 놈인지를 알아낼 수 있는데, 일반적으로는 사용하지 않는 것이 좋다고 합니다. ordinal의 기본 용도는 jdk 안에 있는 EnumSet이나 EnumMap 등의 성능을 위해 있는 것이지 사용자를 위해 제공하는 것이 아니라고 합니다. 만약 순서가 필요할 경우 final int 로 저장을 하라고 합니다.
ex>
--- 틀린 예
public enum Day{ SUN, MON,....}
--- 옳은 예
public enum Day{ 
    SUN(1), MON(2), ... ;
    private final int seq;
    public Day(int seq){this.seq = seq}
    public int getSequence(){ return seq; }
}

2. enum을 이용한 singleton

singleton 패턴이 많이 쓰이기는 하지만 몇 가지 보안상 취약한 부분들이 있답니다. (특히 serialize 관련된 부분, 개인적으로 java의 Serialize는 저주라고 생각합니다!) 또, 만들기도 구찮은 부분이 있습니다. (private constructor 등)
ex>
--- class를 이용한 singleton -- Serializable의 저주가 함께하는 클래스!
public class Singleton implements Serializable{
    public static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    .. 기타 멤버 변수와 각종 메쏘드들.
}
--- enum을 이용한 singleton
public enum Singleton{
    INSTANCE;
    .. 기타 멤버 변수와 각종 메쏘드들.
}

어차피 singleton은 상속이 안 되니까, enum으로 해도 상관없고, 코드도 깔끔해졌습니다. 당근 serialize에 관련된 문제도 해결되었구요.

3. enum의 상속

enum은 기본적으로 상속이 안 됩니다. 상속이 되면 여러가지 문제가 발생할 수 있어서 상속을 없앴다고 합니다. 그러나 interface를 이용할 수는 있습니다.
ex>
public interface Direction{
    int getAngle();
}

public enum DefaultDirection implements Direction{
    동(90), 서(270), 남(180), 북(0);
    private final int angle;
    DefaultDirection (int angle){
        this.angle=angle;
    }
    public int getAngle(){
        return angle;
    }
}

public enum ComplexDirection implements Direction{
    동북(45), 서북(315) , 동남 (135) , 서남(225);
    private final int angle;
    ComplexDirection (int angle){
        this.angle=angle;
    }
    public int getAngle(){
        return angle;
    }
}

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 삼실청년 | 2009/02/04 11:36 | 컴터질~ | 트랙백 | 덧글(0)

트랙백 주소 : http://iilii.egloos.com/tb/4835713
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶