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 λ©μλλ₯Ό μ μ
νκ² ν΄λμ€μ μκΈ° μμ μ 맀κ°λ³μλ‘ μ λ¬
νλ μκ° λ§κ³ , νμ
μ΄ κ°μ νλκ° μ¬λ¬ κ°μΌ λ μ¬μ©νλ©΄ μ’μ
μμ κ°μ μν©μ μμ±μλ₯Ό μ΄μ©νλ©΄, 맀κ°λ³μμ μμλ₯Ό μλͺ» μ€μ ν μ μμ
μμ κ°μ κ²½μ° λ°νμ μλ¬ μνμ±μ κ°μ§λ―λ‘ λ§€κ°λ³μμ μμλ₯Ό ν·κ°λ¦¬μ§ μλλ‘ νλ κ²μ λ§€μ° μ€μ