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

Was this helpful?