item 89 jihoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item89] ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ํ†ต์ œํ•ด์•ผ ํ•œ๋‹ค๋ฉด readResolve ๋ณด๋‹ค๋Š” ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ

์‹ฑ๊ธ€ํ„ด ํด๋ž˜์Šค

// ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ๋ง‰์•„ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง์„ ๋ณด์žฅ
public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
	
    public void leaveTheBuilding() { ... }
}
  • ์ด ํด๋ž˜์Šค์— implements Serializable์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆœ๊ฐ„ ๋” ์ด์ƒ ์‹ฑ๊ธ€ํ„ด์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.

    • ์ปค์Šคํ…€ ์ง๋ ฌํ™”๋‚˜ ๋ช…์‹œ์  readObject๋ฅผ ์ œ๊ณตํ•˜๋”๋ผ๋„ ์†Œ์šฉ์—†๋‹ค.
  • ์–ด๋–ค readObject๋ฅผ ์‚ฌ์šฉํ•˜๋“  ์ด ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค์™€๋Š” ๋ณ„๊ฐœ์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

  • readResolve ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด readObject๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

Serialaizable์„ ๊ตฌํ˜„ํ•œ ์‹ฑ๊ธ€ํ„ด ํด๋ž˜์Šค์˜ readResolve ์ ์šฉ

public class Elvis implements Serializable {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    public void leaveTheBuilding() { ... }
	
    // ์ง„์งœ Elvis๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๊ฐ€์งœ Elvis๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ๋งก๊ธด๋‹ค.
    private Object readResolve() {
        return INSTANCE;
    }
}
  • ์—ญ์ง๋ ฌํ™”ํ•œ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ readResolve ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด ๋’€๋‹ค๋ฉด, ์—ญ์ง๋ ฌํ™” ํ›„ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฆฌํ„ดํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹ ํ•ด ๋ฆฌํ„ด๋œ๋‹ค.
  • readResolve๋ฅผ ์ธ์Šคํ„ด์Šค ํ†ต์ œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๊ฐ์ฒด ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ์ง๋ ฌํ™”๋  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ transient๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.
    • ์‹ฑ๊ธ€ํ„ด์—์„œ readResolve ๋ฉ”์„œ๋“œ๊ฐ€ ์ตœ์ดˆ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋งŒ๋“ค์–ด readObject ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด๋‚ธ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š” ์—†๊ณ , ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์—ญ์‹œ ์ง๋ ฌํ™”ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
public class Elvis implements Serializable {
    public static final Elvis INSTANCE = new Elvis();
	
    // ๊ฐ์ฒด ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค ํ•„๋“œ
    private String[] favoriteSongs = {"Hound Dog", "Heartbreak Hotel"};
  
    private Elvis() {
    }
  
    public void printFavorites() {
        System.out.println(Arrays.toString(favoriteSongs));
    }
  
    private Object readResolve() {
        return INSTANCE;
    }
}

์‹ฑ๊ธ€ํ„ด์„ ์›์†Œ ํ•˜๋‚˜์งœ๋ฆฌ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„

public enum Elvis {
    INSTANCE;
    private String[] favoriteSongs = {"Hound Dog", "Heartbreak Hotel"};
    public void printFavorites() {
        System.out.println(Arrays.toString(favoriteSongs));
    }
}
  • ์—ด๊ฑฐ ํƒ€์ž… ์‹ฑ๊ธ€ํ„ด์ด ์ „ํ†ต์ ์ธ ์‹ฑ๊ธ€ํ„ด๋ณด๋‹ค ์šฐ์ˆ˜ํ•˜๋‹ค.
  • ์ง๋ ฌํ™”์™€ ์ธ์Šคํ„ด์Šค ํ†ต์ œ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ปดํŒŒ์ผ ํƒ€์ž„๋Š” ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋“ค์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— readResolve๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

ํ•ต์‹ฌ ์ •๋ฆฌ

  • ๋ถˆ๋ณ€์‹์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ต์ œํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ž
  • ์—ฌ์˜์น˜ ์•Š์€ ์ƒํ™ฉ์—์„œ ์ง๋ ฌํ™”์™€ ์ธ์Šคํ„ด์Šค ํ†ต์ œ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค๋ฉด readResolve ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ณ , ๊ทธ ํด๋ž˜์Šค์—์„œ ๋ชจ๋“  ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ transient๋กœ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค.