Skip to content

Latest commit

Β 

History

History
108 lines (84 loc) Β· 4.12 KB

Item_2._builder_pattern.md

File metadata and controls

108 lines (84 loc) Β· 4.12 KB

Item 2. μƒμ„±μžμ— λ§€κ°œλ³€μˆ˜κ°€ λ§Žλ‹€λ©΄ λΉŒλ”λ₯Ό κ³ λ €ν•˜λΌ

ν•„λ“œκ°€ λ§Žμ€ 클래슀의 μƒμ„±μžκ°€ κ°–λŠ” 문제점

  • λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œμ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— Human Errorκ°€ λ°œμƒν•  μœ„ν—˜μ΄ 있음
  • 특히 νƒ€μž…μ΄ 같은 fieldκ°€ μ—¬λŸ¬ 개 μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ μœ„ν—˜μ€ 더 컀짐
  • λ§€κ°œλ³€μˆ˜μ˜ ꡬ뢄 λ¬Έμ œλŠ” μžλ°” 빈즈(Java Beans) νŒ¨ν„΄μ„ 톡해 ν•΄κ²°ν•  수 있음

μžλ°” 빈즈 νŒ¨ν„΄

  • κΈ°λ³Έ μƒμ„±μž(No Args Constructor)λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , setter λ©”μ„œλ“œλ₯Ό 톡해 field 값을 μ„€μ •ν•˜λŠ” νŒ¨ν„΄
  • μžλ°” 빈즈 νŒ¨ν„΄μ€ μœ„μ˜ μƒμ„±μž λ°©μ‹μ²˜λŸΌ λ§€κ°œλ³€μˆ˜λ₯Ό ν—·κ°ˆλ¦΄ 일은 μ—†μ§€λ§Œ λ‹€μŒμ˜ λ¬Έμ œμ μ„ 가짐
    • λ©”μ„œλ“œ(setter)λ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜κ²Œ 됨
    • μ΅œμ’… 객체가 완성될 λ•ŒκΉŒμ§€ 일관성(Consistency)이 깨짐
      • Thread-safeλ₯Ό 보μž₯ν•  수 μ—†μŒ
    • ν΄λž˜μŠ€κ°€ λΆˆλ³€(Immutable)으둜 λ§Œλ“€ 수 μ—†μŒ
      • μ–΄λ””μ„œλ“  setterλ₯Ό ν˜ΈμΆœν•΄ field의 값을 λ°”κΏ€ 수 있음

λΉŒλ” νŒ¨ν„΄

Item2 item2 = Item2.builder()
                .field1(1)
                .field2("hello")
                .field3(10L)
                .build();
  • λΉŒλ”λΌλŠ” 별도 객체λ₯Ό 톡해 Method chaining λ°©μ‹μœΌλ‘œ setter λ©”μ„œλ“œλ₯Ό field 값듀을 μ„€μ •ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ(build)λ₯Ό ν˜ΈμΆœν•΄ 객체λ₯Ό νšλ“ν•˜λ„λ‘ ν•˜λŠ” νŒ¨ν„΄
    • Method chainingμ΄λž€, νŠΉμ • 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“€κ³  ν˜ΈμΆœν•œ λ©”μ„œλ“œλ‘œλΆ€ν„° λ°˜ν™˜λœ 객체의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것을 λ°˜λ³΅ν•˜λŠ” 것
      • λΉŒλ”μ˜ 경우 λΉŒλ”μ˜ setter λ©”μ„œλ“œλ“€μ€ λͺ¨λ‘ builderλ₯Ό λ°˜ν™˜ν•΄ chaining ν˜•μ‹μœΌλ‘œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 있음

λΉŒλ” νŒ¨ν„΄μ˜ μž₯점

  • λΉŒλ”λŠ” 생성 μ‹œμ μ—λ§Œ setterκ°€ ν˜ΈμΆœλ˜λ―€λ‘œ λΆˆλ³€μ„±μ„ μœ μ§€ν•  수 있음
  • λΉŒλ”λŠ” μ΅œμ’…μ μœΌλ‘œ buildκ°€ 호좜될 λ•ŒκΉŒμ§€ 객체가 μƒμ„±λ˜μ§€ μ•ŠμœΌλ―€λ‘œ Thread-safe 보μž₯ κ°€λŠ₯

λΉŒλ” νŒ¨ν„΄ κ΅¬ν˜„ 방법

public class Item2 {

    private final int field1;
    private final String field2;
    private final long field3;

    private Item2(Builder builder) {
        this.field1 = builder.field1;
        this.field2 = builder.field2;
        this.field3 = builder.field3;
    }

    public static Builder builder() {
        return new Builder();
    }

    static class Builder {
        private int field1;
        private String field2;
        private long field3;

        public Builder field1(int field1) {
            this.field1 = field1;
            return this;
        }

        public Builder field2(String field2) {
            this.field2 = field2;
            return this;
        }

        public Builder field3(long field3) {
            this.field3 = field3;
            return this;
        }

        public Item2 build() {
            return new Item2(this);
        }
    }

    public static void main(String[] args) {
        Item2 item2 = Item2.builder()
                .field1(1)
                .field2("hello")
                .field3(10L)
                .build();
        System.out.println("field1: " + item2.field1);
        System.out.println("field2: " + item2.field2);
        System.out.println("field3: " + item2.field3);
    }

}
  • λΉŒλ”λ₯Ό 톡해 μ–»κ³ μž ν•˜λŠ” 클래슀(μ΄ν•˜ νƒ€κ²Ÿ 클래슀)의 내뢀에 static class둜 λΉŒλ”λ₯Ό μ •μ˜
  • λΉŒλ” 클래슀 λ‚΄λΆ€μ—λŠ” 자기 μžμ‹ (λΉŒλ”)을 λ°˜ν™˜ν•˜λŠ” setter λ©”μ„œλ“œλ₯Ό μ •μ˜
    • λ©”μ„œλ“œ 체이닝을 μœ„ν•¨
  • νƒ€κ²Ÿ ν΄λž˜μŠ€μ—λŠ” λΉŒλ”λ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ°›λŠ” μƒμ„±μžκ°€ 쑴재
    • λΉŒλ”μ˜ ν•„λ“œλ“€μ„ νƒ€κ²Ÿ 클래슀의 ν•„λ“œλ‘œ ν• λ‹Ή
  • λΉŒλ”μ—λŠ” νƒ€κ²Ÿ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” build λ©”μ„œλ“œλ₯Ό μ •μ˜
    • νƒ€κ²Ÿ ν΄λž˜μŠ€μ— 자기 μžμ‹ μ„ λ§€κ°œλ³€μˆ˜λ‘œ 전달

Memo

  • ν•„λ“œ μˆ˜κ°€ 많고, νƒ€μž…μ΄ 같은 ν•„λ“œκ°€ μ—¬λŸ¬ 개일 λ•Œ μ‚¬μš©ν•˜λ©΄ μ’‹μŒ
  • μœ„μ™€ 같은 상황에 μƒμ„±μžλ₯Ό μ΄μš©ν•˜λ©΄, λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλ₯Ό 잘λͺ» μ„€μ •ν•  수 있음
  • μœ„μ™€ 같은 경우 λŸ°νƒ€μž„ μ—λŸ¬ μœ„ν—˜μ„±μ„ κ°€μ§€λ―€λ‘œ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλ₯Ό ν—·κ°ˆλ¦¬μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것은 맀우 μ€‘μš”