Item 89. Enum for Instance Control

μΈμŠ€ν„΄μŠ€ 수λ₯Ό ν†΅μ œν•΄μ•Ό ν•œλ‹€λ©΄ readResolveλ³΄λ‹€λŠ” μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ

μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ§€ λͺ»ν•˜κ²Œ λ§‰λŠ” λ°©μ‹μœΌλ‘œ μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜λ§Œ λ§Œλ“€μ–΄μ§μ„ 보μž₯ν•  수 μžˆλ‹€.

public class SingletonClass {

    private static final SingletonClass INSTANCE = new SingletonClass();

    private SingletonClass() {
        // ...
    }

    // ...
}

ν•˜μ§€λ§Œ 클래슀 선언에 implements Serializable을 μΆ”κ°€ν•˜λ©΄ 직렬화λ₯Ό ν†΅ν•œ 객체 생성이 κ°€λŠ₯ν•΄μ§€λ©΄μ„œ 더 이상 싱글턴이 μ•„λ‹ˆκ²Œ λœλ‹€.

readResolveλ₯Ό μ΄μš©ν•œ ν•΄κ²° 방법

readResolve κΈ°λŠ₯을 μ΄μš©ν•˜μ—¬ readObjectκ°€ λ°˜ν™˜ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ₯Έ κ²ƒμœΌλ‘œ λŒ€μ²΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•΄λ³Ό 수 μžˆλ‹€.

public class SingletonClass implements Serializable {

    private static final SingletonClass INSTANCE = new SingletonClass();
    private transient SomeField someField; // 직렬화 ν˜•νƒœμ—μ„œ μ•„λ¬΄λŸ° μ‹€ 데이터λ₯Ό κ°€μ§ˆ ν•„μš”κ°€ μ—†μœΌλ‹ˆ λͺ¨λ“  ν•„λ“œλ₯Ό transient둜 μ„ μ–Έ

    private SingletonClass() {
        // ...
    }

    public static SingletonClass getInstance() {
        return INSTANCE;
    }

    // μ—­μ§λ ¬ν™”λœ 객체λ₯Ό λŒ€μ‹ ν•  객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œ
    private Object readResolve() {
        // μ§„μ§œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κ³ , 역직렬화 쀑 생긴 μΈμŠ€ν„΄μŠ€λŠ” GCμ—μ„œ μ œκ±°λ˜λ„λ‘ 함
        return INSTANCE;
    }
}

readResolve λ©”μ„œλ“œ κ΅¬ν˜„ 및 transient 선언을 톡해 ν•΄κ²°ν•  수 μžˆλŠ”λ°, 각각의 κ΅¬ν˜„μ€ μ•„λž˜μ˜ 역할을 ν•˜κ²Œ λœλ‹€.

  • readResolve λ©”μ„œλ“œ κ΅¬ν˜„: μ—­μ§λ ¬ν™”λœ 객체λ₯Ό λŒ€μ‹ ν•  객체λ₯Ό λ°˜ν™˜ν•˜μ—¬ μ—­μ§λ ¬ν™”ν•˜μ—¬ 생긴 객체 μ ‘κ·Ό 방지

  • λͺ¨λ“  ν•„λ“œλ₯Ό transient μ„ μ–Έ: 일반 μ°Έμ‘° ν•„λ“œκ°€ μžˆλ‹€λ©΄ ν•΄λ‹Ή ν•„λ“œμ˜ λ‚΄μš©μ€ readResolve λ©”μ„œλ“œκ°€ μˆ˜ν–‰λ˜κΈ° 전에 역직렬화가 μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό 방지

μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 더 μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆμ§€λ§Œ, μ•„λž˜μ˜ 상황에선 readResolveλ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 κ³ λ €ν•΄λ³΄λŠ” 것도 μ’‹λ‹€.

  • 직렬화 κ°€λŠ₯ μΈμŠ€ν„΄μŠ€ ν†΅μ œ 클래슀λ₯Ό μž‘μ„±ν•΄μ•Όν•˜μ§€λ§Œ, μ»΄νŒŒμΌνƒ€μž„μ—λŠ” μ–΄λ–€ μΈμŠ€ν„΄μŠ€λ“€μ΄ μžˆλŠ”μ§€ μ•Œ 수 μ—†λŠ” 상황

μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•œ ν•΄κ²° 방법

readResolve κ΅¬ν˜„κ³Ό transient 선언을 톡해 ν•΄κ²°ν•  수 μžˆμ§€λ§Œ 신경을 많이 μ¨μ•Όν•˜λŠ” μž‘μ—…μΈλ°, μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ μž‘μ—…μ„ κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆλ‹€.

public enum SingletonEnum {
    INSTANCE; // μ„ μ–Έν•œ μƒμˆ˜ μ™Έμ˜ λ‹€λ₯Έ κ°μ²΄λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ μžλ°”κ°€ 보μž₯

    // ...
}

Last updated