public final class Test {
private final Date date;
public Test() {
date = new Date();
}
public Test(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
public String toString() {
return "Test:[date=" + date.toString() + "]";
}
}
-2
A
답변
6
클래스의 인스턴스 자체는 변경할 수 없지만 Date
은 변경 가능하기 때문에 (예 : java.util.Date
이라고 가정) 해당 인스턴스의 정보는 변경 될 수 있습니다. 예를 들어
:
myTest.getDate().setTime(0L);
당신이 방지하려면, 당신은 방어 Date
을 복사해야합니다.
public Test(Date d) {
this.date = new Date(d.getTime());
}
public Date getDate() {
return new Date(this.date.getTime());
}
그런 식으로 클래스 외부의 사용자는 date
필드에 액세스하여이를 변경시킬 수 없습니다.
또는 가변형 대신 LocalDate
또는 LocalDateTime
과 같은 변경 불가능한 날짜 유형을 사용하십시오.
0
대신 날짜 개체의 복제본을 반환하십시오.
public final class Test {
private final Date date;
public Test() {
date = new Date();
}
public Test(Date date) {
this.date = (Date)date.clone();
}
public Date getDate() {
return (Date)date.clone();
}
public String toString() {
return "Test:[date=" + date.toString() + "]";
}
}
새로운 객체의 생성에 대한 성능 문제가있는 경우, 당신은 long
대신 Date
객체로 저장하는 시간을 대신 할 수 있습니다.
당신은 그것이 이미 아닌 것으로 어떻게 생각합니까? – Stultuske
'Date' 클래스는 변경 가능하므로 getter에서'date' 필드를 노출시키지 않아야합니다. – khelwood
노출시키지 마십시오. 그러면 문제가 없습니다. – byxor