item 2 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 2λ₯Ό μμ½ν λ΄μ© μ λλ€.
μ μ ν©ν°λ¦¬μ μμ±μμλ λκ°μ μ μ½μ΄ νλ μλ€. μ νμ 맀κ°λ³μκ° λ§μ λ μ μ ν λμνκΈ° μ΄λ ΅λ€λ μ μ΄λ€.
νλ‘κ·Έλλ¨Έλ€μ μ΄λ΄ λ μ μΈ΅μ μμ±μ ν¨ν΄μ μ¦κ²¨ μ¬μ©νλ€.
μ μΈ΅μ μμ±μ ν¨ν΄μ΄λ?
νμ 맀κ°λ³μλ§ λ°λ μμ±μ , νμ 맀κ°λ³μμ μ ν 맀κ°λ³μ 1κ°λ₯Ό λ°λ μμ±μ ννλ‘ μ ν 맀κ°λ³μλ₯Ό μ λΆ λ€ λ°λ μμ±μκΉμ§ λλ €κ°λ λ°©μ
public class Student {
private String name;
private String email;
private String class;
private int age;
// μ΅μ μꡬ쑰건
public Student(String name, String email) {
this.name = name;
this.email = email;
}
public Student(String name, String email, String address, String class) {
this.name = name;
this.email = email;
this.class = class;
}
public Student(String name, String email, String class, int age) {
this.name = name;
this.email = email;
this.class = class;
this.age = age;
}
}
μ μΈ΅μ μμ±μ ν¨ν΄λ μΈ μλ μμ§λ§, 맀κ°λ³μ κ°μκ° λ§μμ§λ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μμ±νκ±°λ μ½κΈ° μ΄λ ΅λ€.
ν΄λΌμ΄μΈνΈκ° μ€μλ‘ λ§€κ°λ³μμ μμλ₯Ό λ°κΏ 건λ€μ€λ μ»΄νμΌλ¬λ μμμ±μ§ λͺ»νκ³ , κ²°κ΅ λ°νμμ μλ±ν λμμ νκ² λλ€.
μ΄λ²μλ μ ν 맀κ°λ³μκ° λ§μ λ νμ©ν μ μλ λ λ²μ§Έ λμμΈ μλ°λΉμ¦ν¨ν΄μ λ³΄κ² λ€. 맀κ°λ³μκ° μλ μμ±μλ‘ κ°μ²΄λ₯Ό λ§λ ν, Setter λ©μλλ€μ νΈμΆν΄ μνλ 맀κ°λ³μμ κ°μ μ€μ νλ λ°©μμ΄λ€.
public class NutritionFacts {
private int servingSize = -1;
private int servings = -1;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public NutritionFacts() { }
public void setServingSize(int val) { ... }
public void setServings(int servings) { ... }
public void setCalories(int calories) { ... }
public void setFat(int fat) { ... }
public void setSodium(int sodium) { ... }
public void setCarbohydrate(int carbohydrate) { ... }
}
μ½λκ° κΈΈμ΄μ§κΈ΄ νμ§λ§ μΈμ€ν΄μ€λ₯Ό λ§λ€κΈ° μ½κ³ , κ·Έ κ²°κ³Ό λ μ½κΈ° μ¬μ΄ μ½λκ° λμλ€.
μλ°λΉμ¦ν¨ν΄μμλ κ°μ²΄ νλλ₯Ό λ§λ€λ €λ©΄ λ©μλλ₯Ό μ¬λ¬ κ° νΈμΆν΄μΌ νκ³ , κ°μ²΄κ° μμ ν μμ±λκΈ° μ κΉμ§λ **μΌκ΄μ±(consistency)**μ΄ λ¬΄λμ§ μνμ λμ΄κ² λλ€.
μ΄μ²λΌ μΌκ΄μ±μ΄ 무λμ§λ λ¬Έμ λλ¬Έμ μλ°λΉμ¦ ν¨ν΄μμλ ν΄λμ€λ₯Ό λΆλ³μΌλ‘ λ§λ€ μ μμΌλ©° μ€λ λ μμ μ±μ μ»μΌλ €λ©΄ νλ‘κ·Έλλ¨Έκ° μΆκ° μμ μ ν΄μ€μΌλ§ νλ€.
Q1. μ€λ λ μμ μ±μ΄ νμν κ²½μ° νμν μΆκ° μμ μ΄λ?
μ΄λ¬ν λ¨μ μ μννκ³ μ μμ±μ΄ λλ κ°μ²΄λ₯Ό μλμΌλ‘ 'μΌλ¦¬κ³ (freezing)' μΌλ¦¬κΈ° μ μλ μ¬μ©ν μ μλλ‘ νκΈ°λ νλ€.
Q2. μλ°μλ μΌλ¦΄ μ μλ λ°©λ²μ΄ μλ?
λ€νν μ°λ¦¬μκ² μΈ λ²μ§Έ λμμ΄ μλ€.
μ μΈ΅μ μμ±μ ν¨ν΄μ μμ μ±κ³Ό μλ°λΉμ¦ ν¨ν΄μ κ°λ μ±μ κ²ΈλΉν λΉλ ν¨ν΄μ΄λ€. ν΄λΌμ΄μΈνΈλ νμν κ°μ²΄λ₯Ό μ§μ λ§λλ λμ , νμ 맀κ°λ³μλ§μΌλ‘ μμ±μ(νΉμ μ μ ν©ν°λ¦¬)λ₯Ό νΈμΆν΄ λΉλ κ°μ²΄λ₯Ό μ»λλ€.
λΉλλ μμ±ν ν΄λμ€ μμ μ μ λ©€λ² ν΄λμ€λ‘ λ§λ€μ΄λλκ² λ³΄ν΅μ΄λ€.
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// νμ 맀κ°λ³μ
private final int servingSize;
private final int servings;
// μ ν 맀κ°λ³μ - κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννλ€.
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) { calories = val; return this }
public Builder fat(int val) { fat = val; return this }
public Builder sodium(int val) { sodium = val; return this }
public Builder carbohydrate(int val) { carbohydrate = val; return this }
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
λΉλμ μΈν° λ©μλλ€μ λΉλ μμ μ λ°ννκΈ° λλ¬Έμ μ°μμ μΌλ‘ νΈμΆν μ μλ€.
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).fat(35).sodium(40).carbohydrate(1).build();
μ΄ ν΄λΌμ΄μΈνΈ μ½λλ μ°κΈ° μ½κ³ , 무μ보λ€λ μ½κΈ° μ½λ€.
λΉλ ν¨ν΄μ μλΉν μ μ°νλ€. λΉλ νλλ‘ μ¬λ¬ κ°μ²΄λ₯Ό μννλ©΄μ λ§λ€ μ μκ³ , λΉλμ λκΈ°λ 맀κ°λ³μμ λ°λΌ λ€λ₯Έ κ°μ²΄λ₯Ό λ§λ€ μλ μλ€.
λΉλ ν¨ν΄μ μ₯μ λ§ μλ κ²μ μλλ€. κ°μ²΄λ₯Ό λ§λ€λ €λ©΄ κ·Έμ μμ λΉλλΆν° λ§λ€μ΄μΌ νλ€. λΉλ μμ± λΉμ©μ΄ ν¬μ§λ μμ§λ§ μ±λ₯μ λ―Όκ°ν μν©μμλ λ¬Έμ κ° λ μ μλ€.
μμ±μλ μ μ ν©ν°λ¦¬ λ°©μμΌλ‘ μμνλ€κ° λμ€μ 맀κ°λ³μκ° λ§μμ§λ©΄ λΉλ ν¨ν΄μΌλ‘ μ νν μλ μμ§λ§, μ΄μ μ λ§λ€μ΄λ μμ±μμ μ μ ν©ν°λ¦¬κ° μμ£Ό λλλΌμ Έ λ³΄μΌ κ²μ΄λ€. κ·Έλ¬λ μ μ΄μ λΉλλ‘ μμνλ νΈμ΄ λμ λκ° λ§λ€.
Q3. μ€νλ§μμλ lombokμ μ¬μ©νμ¬ Builder μ΄λ Έν μ΄μ λ§μΌλ‘ λΉλ ν¨ν΄μ ꡬνν μ μλ€. κ·Έλ°λ° νμ κ° μ€μ μ΄ κ°λ₯ν κΉ?
@Builder
public class User {
@Builder.Default private String name = "incheol";
private String address;
private Integer age;
public static void main(String[] args) {
User incheol = User.builder()
.address("seongnamsi")
.age(10)
.build();
}
}
μμ±μλ μ μ ν©ν°λ¦¬κ° μ²λ¦¬ν΄μΌ ν 맀κ°λ³μκ° λ§λ€λ©΄ λΉλ ν¨ν΄μ μ ννλ κ² λ λ«λ€. 맀κ°λ³μ μ€ λ€μκ° νμκ° μλκ±°λ κ°μ νμ μ΄λ©΄ νΉν λ κ·Έλ λ€. λΉλλ μ μΈ΅μ μμ±μλ³΄λ€ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μ½κ³ μ°κΈ°κ° ν¨μ¬ κ°κ²°νκ³ μλ°λΉμ¦λ³΄λ€ ν¨μ¬ μμ νλ€.