defensive-copy

์˜๋ฏธ

  • ๋ฐฉ์–ด์  ๋ณต์‚ฌ.

    • ์–ด๋–ค ์ทจ์•ฝ์ ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•?

์ทจ์•ฝ์ 

  • TOCTOU(Time Of Check / Time Of Use)

public final class Period {
    private final Date start;
    private final Date end;

    public Period(Date start, Date end) {
        if (start.compareTo(end) > 0) {
            throw new IllegalArgumentException("start๊ฐ€ end๋ณด๋‹ค ๋Šฆ์œผ๋ฉด ์•ˆ๋œ๋‹ค");
        }
        this.start = start;
        this.end = end;
    }

    public Date getStart() { return start; }
    public Date getEnd() { return end; }
  • start.compareTo(end) > 0 ํ•ด๋‹น ์ฝ”๋“œ validation ์ดํ›„์— Date end ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ.

    • Time of Check

  • ํ˜น์€ ์‚ฌ์šฉ ์‹œ์ ์— Date start or Date end ๋ฅผ ์™ธ๋ถ€์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ.

    • ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ์ด๋‹ˆ.

    • ๊ทธ๋Ÿฌ๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ดˆ๋ž˜๋จ.

  • ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” final class Period ๋กœ ์„ ์–ธํ–ˆ์–ด๋„ immutableํ•œ ํด๋ž˜์Šค๊ฐ€ ์ „ํ˜€ ์•„๋‹˜.

์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์ทจ์•ฝ์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ๊ฐํ•ด๋ณผ ๋•Œ, ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋Š”, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์„œ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋“ฏ.

  • ์ฆ‰ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ฉค๋ฒ„ ๊ฐ์ฒด์™€, ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ๋Š์–ด์ฃผ๊ธฐ ์œ„ํ•จ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

public Period(Date start, Date end) {
    this.start = new Date(start.getTime()); // defensive copy
    this.end = new Date(end.getTime());     // defensive copy
    if (this.start.compareTo(this.end) > 0) {
        throw new IllegalArgumentException("start๊ฐ€ end๋ณด๋‹ค ๋Šฆ์œผ๋ฉด ์•ˆ๋œ๋‹ค");
    }
}
  • new Date() ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ.

    • ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๋Š์Œ -> defensive copy

์ฐธ๊ณ 

Last updated

Was this helpful?