item 50 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
λ°©μ΄μ 볡μ¬λ?
μ΄λ€ ν΄λμ€μ λ©μλμμ ν΄λμ€μ λ©€λ² λ³μ(κ°μ²΄)μ κ°μ μ°κ±°λ κ°μ Έμ¬ λ 볡μ¬λ³Έμ λ§λ€μ΄μ get/set μ μ¬μ©νλ κ²μ΄λ€.
μλ₯Ό λ€μ΄μ get/set λ©μλμΌ λΏ λ€λ₯Έ λ©μλλ λ©€λ² λ³μμ μ κ·Όνλ€λ©΄ 볡μ¬λ³Έμ λ§λ€ νμκ° μλ€.)
- μ€μν κ²μ νλΌλ―Έν°μ μ ν¨μ±μ κ²μ¬νκΈ° μ μ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€κ³ μ΄ λ³΅μ¬λ³ΈμΌλ‘ μ ν¨μ±μ κ²μ¬ν΄μΌνλ€.
μ μμ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€λΌ
- μλ°λ Cλ C++μ λΉν΄ λ©λͺ¨λ¦¬ μΆ©λ μ€λ₯μμ μμ νλ€.
- μλ°λ‘ μμ±ν ν΄λμ€λ μμ€ν μ λ€λ₯Έ λΆλΆμμ λ¬΄μ¨ μ§μ νλ κ·Έ λΆλ³μ μ΄ μ§μΌμ§λ€.
λ€λ₯Έ ν΄λμ€λ‘λΆν° μΉ¨λ²μ λ§κΈ°μν΄ λ°©μ΄μ μΌλ‘ νλ‘κ·Έλλ°ν΄μΌ νλ€.
- μ무리 μλ°λΌ ν΄λ λ€λ₯Έ ν΄λμ€λ‘λΆν° μΉ¨λ²μ μλ¬΄λ° λ Έλ ₯ μμ΄ λ€ λ§μ μ μλ 건 μλλ€.
- μ΄λ€ κ°μ²΄λ κ·Έ κ°μ²΄μ νλ½ μμ΄λ μΈλΆμμ λ΄λΆλ₯Ό μμ νλ μΌμ λΆκ°λ₯νλ€. νμ§λ§ μ£Όμλ₯Ό κΈ°μΈμ΄μ§ μμΌλ©΄ μκΈ°λ λͺ¨λ₯΄κ² λ΄λΆλ₯Ό μμ νλλ‘ νλ½νλ κ²½μ°κ° μκΈ΄λ€.
κΈ°κ°μ ν¬ννλ ν΄λμ€
- Dateκ° κ°λ³μ΄λΌλ μ¬μ€μ μ΄μ©νλ©΄ λΆλ³μμ κΉ¨λ¨λ¦΄ μ μλ€.
// μ½λ 50-1 κΈ°κ°μ νννλ ν΄λμ€ - λΆλ³μμ μ§ν€μ§ λͺ»νλ€. (302-305μͺ½)
public final class Period {
private final Date start;
private final Date end;
/**
* @param start μμ μκ°
* @param end μ’
λ£ μκ°. μμ μκ°λ³΄λ€ λ€μ¬μΌ νλ€.
* @throws IllegalArgumentException μμ μκ°μ΄ μ’
λ£ μκ°λ³΄λ€ λ¦μ λ λ°μνλ€.
* @throws NullPointerException startλ endκ° nullμ΄λ©΄ λ°μνλ€.
*/
public Period(Date start, Date end) {
if (start.compareTo(end) > 0)
throw new IllegalArgumentException(
start + "κ° " + end + "λ³΄λ€ λ¦λ€.");
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
public String toString() {
return start + " - " + end;
}
}
μλ° 8 μ΄νλ‘λ μ½κ² ν΄κ²° κ°λ₯
// μ½λ 50-2 Period μΈμ€ν΄μ€μ λ΄λΆλ₯Ό 곡격ν΄λ³΄μ. (303μͺ½)
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78); // pμ λ΄λΆλ₯Ό λ³κ²½νλ€!
System.out.println(p);
- Date λμ λΆλ³μΈ Instantλ₯Ό μ¬μ©νλ©΄ λλ€. (νΉμ LocalTimeμ΄λ ZoneDateTImeμ μ¬μ©ν΄λ λλ€)
- Dateλ λ‘μ APIμ΄λ μλ‘μ΄ μ½λλ₯Ό μμ±ν λλ λ μ΄μ νμ©νλ©΄ μλλ€.
- νμ§λ§ μμΌλ‘ μ°μ§ μλλ€κ³ μ΄ λ¬Έμ μμ ν΄λ°©λλ 건 μλλ€. (λ΄λΆ ꡬνμ κ°λ³μΈ λ‘μ κ° νμ μ μ¬μ©νλ μμ¬κ° λ¨μμλ€.)
- μΈλΆ 곡격μΌλ‘λΆν° Period μΈμ€ν΄μ€μ λ΄λΆλ₯Ό 보νΈνλ €λ©΄ μμ±μμμ λ°μ κ°λ³ 맀κ°λ³μ κ°κ°μ λ°©μ΄μ μΌλ‘ 볡μ¬(defensive copy) ν΄μΌ νλ€.
- Period μΈμ€ν΄μ€ μμμλ μλ³Έμ΄ μλ 볡μ¬λ³Έμ μ¬μ©ν΄μΌ νλ€.
// μλ‘ μμ±ν μμ±μλ₯Ό μ¬μ©νλ©΄ μμμ 곡격μ λ μ΄μ Periodμ μνμ΄ λμ§ μλλ€.
// 맀κ°λ³μμ μ ν¨μ± κ²μ¬νκΈ° μ μ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€κ³ μ΄ λ³΅μ¬λ³ΈμΌλ‘ μ ν¨μ± κ²μ¬λ₯Ό νλ€.
μ½λ 50-3 μμ ν μμ±μ - 맀κ°λ³μμ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ λ€. (304μͺ½)
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if (this.start.compareTo(this.end) > 0)
throw new IllegalArgumentException(
this.start + "κ° " + this.end + "λ³΄λ€ λ¦λ€.");
}
- λ°©μ΄μ 볡μ¬μ Dateμ clone λ©μλλ₯Ό μ¬μ©νμ§ μμ μ μλ μ£Όλͺ©νμ.
- Dateλ finalμ΄ μλλ―λ‘ cloneμ΄ Dateκ° μ μν κ² μλ μ μλ€.
맀κ°λ³μκ° μ 3μμ μν΄ νμ₯λ μ μλ νμ μ΄λΌλ©΄ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€ λ cloneμ μ¬μ©ν΄μλ μ λλ€.
μμ±μλ₯Ό μμ νλ©΄ μμμ 곡격μ λ§μλΌ μ μμ§λ§ Period μΈμ€ν΄μ€λ μμ§λ λ³κ²½ κ°λ₯νλ€. (μ κ·Όμ λ©μλκ° λ΄λΆμ κ°λ³ μ 보λ₯Ό μ§μ λλ¬λ΄κΈ° λλ¬Έμ΄λ€.
μμ±μλ₯Ό μμ νλ©΄ μμμ 곡격μ λ§μλΌ μ μμ§λ§ Period μΈμ€ν΄μ€λ μμ§λ λ³κ²½ κ°λ₯νλ€. μ κ·Όμ λ©μλκ° λ΄λΆμ κ°λ³ μ 보λ₯Ό μ§μ λλ¬λ΄κΈ° λλ¬Έμ΄λ€.
λλ²μ§Έ 곡격μ λ§μλ΄λ €λ©΄ λ¨μν μ κ·Όμκ° κ°λ³ νλμ λ°©μ΄μ 볡μ¬λ³Έμ λ°ννλ©΄ λλ€.
// 'λΆλ³'μΈ Periodμ λ΄λΆλ₯Ό 곡격νλ λ κ°μ§ μ (303-305μͺ½)
public class Attacks {
public static void main(String[] args) {
// μ½λ 50-4 Period μΈμ€ν΄μ€λ₯Ό ν₯ν λ λ²μ§Έ 곡격 (305μͺ½)
start = new Date();
end = new Date();
p = new Period(start, end);
p.end().setYear(78); // pμ λ΄λΆλ₯Ό λ³κ²½νλ€!
System.out.println(p);
}
}
// μμ ν μ κ·Όμ - νλμ λ°©μ΄μ 볡μ¬λ³Έμ λ°ννλ€.
// μλ‘μ΄ μ κ·ΌμκΉμ§ κ°μΆλ©΄ Periodλ μλ²½ν λΆλ³μΌλ‘ κ±°λλλ€.
// μμ μκ°μ΄ μ’
λ£ μκ°λ³΄λ€ λμ€μΌ μ μλ€λ λΆλ³μμ μλ°°ν λ°©λ²μ μλ€.
// Period μμ λ§κ³ λ κ°λ³ νλμ μ κ·Όν λ°©λ²μ΄ μμΌλ νμ€νλ€.
> λͺ¨λ νλκ° κ°μ²΄ μμ μλ²½νκ² μΊ‘μνλμλ€.
public Date start() {
return new Date(start.getTime());
]
public Date end() {
return new Date(end.getTime());
}
- μμ±μμ λ¬λ¦¬ μ κ·Όμ λ©μλλ λ°©μ΄μ 볡μ¬μ cloneμ μ¬μ©ν΄λ λλ€.
- Periodκ° κ°μ§κ³ μλ Date κ°μ²΄λ java.util.Dateμμ΄ νμ€νκΈ° λλ¬Έμ΄λ€. (μ λ’°ν μ μλ νμ ν΄λμ€κ° μλλ€) κ·Έλ λλΌλ μμ΄ν 13(clone μ¬μ μλ μ£Όμν΄μ μ¬μ©νλΌ)μμ μ€λͺ ν μ΄μ λλ¬Έμ μΈμ€ν΄μ€λ₯Ό 볡μ¬νλ λ°λ μΌλ°μ μΌλ‘ μμ±μλ μ μ ν©ν°λ¦¬λ₯Ό μ°λκ² μ’λ€.
- λ°©μ΄μ 볡μ¬μλ μ±λ₯ μ νκ° λ°λ₯΄κ³ λ νμ μΈ μ μλ κ²λ μλλ€.
- (κ°μ ν¨ν€μ§μ μνλ λ±μ μ΄μ λ‘) νΈμΆμκ° μ»΄ν¬λνΈ λ΄λΆλ₯Ό μμ νμ§ μμΌλ¦¬λΌ νμ νλ©΄ λ°©μ΄μ 볡μ¬λ₯Ό μλ΅ν μ μλ€.
- μ΄λ¬ν μν©μ΄λΌλ νΈμΆμμμ ν΄λΉ 맀κ°λ³μλ λ°νκ°μ μμ νμ§ λ§μμΌ ν¨μ λͺ νν λ¬Έμννλ κ² μ’λ€.
ν΅μ¬ μ 리
ν΄λμ€κ° ν΄λΌμ΄μΈνΈλ‘λΆν° λ°λ νΉμ ν΄λΌμ΄μΈνΈλ‘ λ°ννλ ꡬμ±μμκ° κ°λ³μ΄λΌλ©΄ κ·Έ μμλ λ°λμ λ°©μ΄μ μΌλ‘ 볡μ¬ν΄μΌ νλ€.