μλ°λ μΌλ°μ μΌλ‘ μμ ν μΈμ΄λ€.
νμ§λ§ μ무리 μλ°λΌ ν΄λ λ€λ₯Έ ν΄λμ€λ‘λΆν°μ μΉ¨λ²μ μλ¬΄λ° λ Έλ ₯ μμ΄ λ€ λ§μ μ μλ κ²μ μλλ€. κ·Έλ κΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈκ° μ°λ¦¬μ λΆλ³μμ κΉ¨λ¨λ¦¬λ € νμμ΄ λμ΄ μλ€κ³ κ°μ νκ³ λ°©μ΄μ μΌλ‘ νλ‘κ·Έλλ°ν΄μΌ νλ€.
π 1. 첫 λ²μ§Έ 곡격 - μμ±μ μ΄μ©
'μμ μκ°μ΄ μ’ λ£ μκ°λ³΄λ€ λ¦μ μ μλ€λ λΆλ³μ'μ΄ μλ λ€μκ³Ό κ°μ ν΄λμ€κ° μλ€κ³ νμ.
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;
}
...
}
μ΄ ν΄λμ€λ Dateκ° κ°λ³μ΄λΌλ μ¬μ€μ μ΄μ©νλ€λ©΄ μ΄λ ΅μ§ μκ² λΆλ³μμ΄ κΉ¨μ§λ€.
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78); // pμ λ΄λΆλ₯Ό μμ !!
μΈλΆ 곡격μΌλ‘λΆν° Period μΈμ€ν΄μ€μ λ΄λΆλ₯Ό 보νΈνλ €λ©΄ μμ±μμκ² λ°μ κ°λ³ 맀κ°λ³μ κ°κ°μ λ°©μ΄μ μΌλ‘ 볡μ¬(defensive copy) ν΄μΌ νλ€.
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 + "λ³΄λ€ λ¦λ€.");
}
κ·Έλ¦¬κ³ Period μΈμ€ν΄μ€ μμμλ μλ³Έμ΄ μλ 볡μ¬λ³Έμ μ΄μ©ν΄μΌ νλ€.
μ΄λ, 맀κ°λ³μμ μ ν¨μ±μ κ²μ¬νκΈ° μ μ λ°©μ΄μ 볡μ¬λ³Έμ λ§λ€κ³ , μ΄ λ³΅μ¬λ³ΈμΌλ‘ μ ν¨μ±μ κ²μ¬ν μ μ μ£Όλͺ©νμ. μμκ° λΆμμ°μ€λ¬μ 보μ΄κ² μ§λ§ λ°λμ μ΄λ κ² μμ±ν΄μΌ νλ€. λ©ν°μ€λ λ© νκ²½μ΄λΌλ©΄ μλ³Έ κ°μ²΄μ μ ν¨μ±μ κ²μ¬ν ν 볡μ¬λ³Έμ λ§λλ κ·Έ μ°°λμ μ·¨μ½ν μκ°μ λ€λ₯Έ μ€λ λκ° μλ³Έ κ°μ²΄λ₯Ό μμ ν μνμ΄ μκΈ° λλ¬Έμ΄λ€.
λν, λ°©μ΄μ 볡μ¬μ Dateμ clone λ©μλλ₯Ό μ¬μ©νμ§ μμ μ μλ μ£Όλͺ©νμ. Dateλ finalμ΄ μλλ―λ‘ cloneμ΄ Dateκ° μ μν κ² μλ μ μκΈ° λλ¬Έμ΄λ€.
π 2. λ λ²μ§Έ 곡격 - μ κ·Όμ μ΄μ©
μμ§κΉμ§ μμ νμ§ μλ€. μ κ·Όμ λ©μλκ° λ΄λΆμ κ°λ³ μ 보λ₯Ό μ§μ λλ¬λ΄κ³ μλ€. κ·Έλμ μλμ κ°μ κ³΅κ²©μ΄ κ°λ₯νλ€.
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
p.end().setYear(78); // pμ λ΄λΆλ₯Ό λ³κ²½!!!
μ΄λ₯Ό λ°©μ΄νκΈ° μν΄μλ λ¨μν μ κ·Όμκ° κ°λ³ νλμ λ°©μ΄μ 볡μ¬λ³Έμ λ°ννλ©΄ λλ€.
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
π 3. μΆκ° λ΄μ© μ 리
μμμ μ΄ν΄λ³Έ λ΄μ©μ ν΅ν΄ λ°©μ΄μ 볡μ¬λ³Έμ μμ±μμ μ κ·Όμλ₯Ό μ²λ¦¬ν λλ§ λ§λ λ€κ³ μκ°νμ§ λ§μ.
λ©μλλ μμ±μλ ν΄λΌμ΄μΈνΈκ° μ 곡ν κ°μ²΄μ μ°Έμ‘°λ₯Ό λ΄λΆμ μλ£κ΅¬μ‘°μ 보κ΄ν΄μΌ ν λλ©΄ νμ κ·Έ κ°μ²΄κ° μ μ¬μ μΌλ‘ λ³κ²½λ μ μλμ§λ₯Ό μκ°ν΄μΌ νλ€.
λν, ν΄λμ€κ° λΆλ³μ΄λ κ°λ³μ΄λ , κ°λ³μΈ λ΄λΆ κ°μ²΄λ₯Ό ν΄λΌμ΄μΈνΈμ λ°νν λλ λ°λμ μ¬μ¬μκ³ ν΄μΌ νλ€.
λ°©μ΄μ 볡μ¬μλ μ±λ₯ μ νκ° λ°λ₯΄κ³ , λ νμ μΈ μ μλ κ²λ μλλ€. (κ°μ ν¨ν€μ§μ μνλ λ±μ μ΄μ λ‘) νΈμΆμκ° μ»΄ν¬λνΈ λ΄λΆλ₯Ό μμ νμ§ μμΌλ¦¬λΌ νμ νλ©΄ λ°©μ΄μ 볡μ¬λ₯Ό μλ΅ν μ μλ€. μ΄λ¬ν μν©μ΄λΌλ νΈμΆμμμ ν΄λΉ 맀κ°λ³μλ λ°νκ°μ μμ νμ§ λ§μμΌ ν¨μ λͺ νν λ¬Έμννλ κ² μ’λ€. λ€λ₯Έ ν¨ν€μ§μμ μ¬μ©νλ κ²½μ°λ λ§μ°¬κ°μ§λ‘ νμ€ν λ¬Έμνν΄μΌ νλ€.
ν΄λΉ κΈμ Joshua Bloch λμ 'Effective Java 3/E'λ₯Ό μ°Έκ³ νμμ΅λλ€.