2017-05-04 3 views
-2
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

당신은 그것이 이미 아닌 것으로 어떻게 생각합니까? – Stultuske

+2

'Date' 클래스는 변경 가능하므로 getter에서'date' 필드를 노출시키지 않아야합니다. – khelwood

+0

노출시키지 마십시오. 그러면 문제가 없습니다. – byxor

답변

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과 같은 변경 불가능한 날짜 유형을 사용하십시오.

+1

더 나은 점은, 변경 불가능한 java.time 라이브러리를 사용하는 것입니다. – shmosel

+0

@shmosel 좋은 생각. – khelwood

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 객체로 저장하는 시간을 대신 할 수 있습니다.