2013-02-25 3 views
3

Netbeans은 IDEA Code Inspections List에 나타나는이 코드에 대해 불만을 제기하고 있습니다.날짜 또는 달력 필드 반환

public Date getStartDate() 
{ 
    return theStartDate; 
} 

IDEA 사이트는 말한다 :

이 검사 방법에서 java.lang.Date 또는 java.lang.Calendar 필드를 반환하는 시도를보고합니다. 날짜 또는 일정이 이기 때문에 종종 불변 값으로 처리되었지만 실제로 변경할 수있는 경우이 구성은 예기치 않게 으로 수정 된 상태의 개체를 생성 할 수 있습니다. 성능상의 이유로 때때로 유용하지만이 구조는 본질적으로 버그가 발생하기 쉽습니다.

그 밖의 방법은 Date입니까?

+0

'return new date (theStartDate.getTime()); ' –

답변

9

당신은 대부분 간단한 아마 이것은 java.util.Date 때문이다
return new Date(theStartDate.getTime());

입니다 의도하지 않은 수정

을 방지하기 위해, 오히려 현재 개체보다 문제가되는 값의 사본을 반환해야 변경 가능한 객체는, 당신은 같은 일을 실수 또는 악의적 발신자의 문제를 방지하려면 : 당신이 변화 AB를 한 경우

yourObject.getStartDate().setTime(0); 

을 비와 같은 진술은 무해해진다.

왜 복사 생성자가 아닌 복제 생성자입니까? 여기를 참조하십시오 : java.util.Date clone or copy to not expose internal reference

이 방법을 사용할 때마다 새로운 개체를 생성 할 때 성능이 저하 될 수 있으므로주의해서 사용해야합니다.

1

날짜를 변경할 수없는 길이로 반환 할 수 있습니다 (Date.getTime()). 이렇게하면 호출자가 날짜를 변경하지 않도록 할 수 있습니다.

다른 옵션은 날짜를 길게 가져오고 새로운 날짜 return new Date(dateAsLong)을 반환하는 것입니다. 이것은 Date 객체를 반환하면서 원래 날짜를 보호합니다.

+0

날짜가'long'입니까? 왝. –

+0

@ TomHawtin-tackline Java date (http://docs.oracle.com/javase/7/docs/api/java/sql/Date.html) 용으로 비 권장되지 않는 유일한 생성자는 "milliseconds 1970 년 1 월 1 일 00:00:00 GMT 이후 " –

+0

나를 위해 전화 해주세요. (건반 지점 : 인수가없는 생성자도 비 권장되지 않습니다.) –

2

return new Date(theStartDate.getTime());

2

IDEA는 단순히 날짜 객체는 종종 불변의 객체로 사용됩니다 말하고있다. 합리적인 해결책은 생성자에 StartDate.getTime()을 사용하여 새 Date 객체를 반환하는 것입니다.

public long getStartDateMilliseconds() 
{ 
    return theStartDate.getTime(); 
} 

당신이 Date 정보를 반환 할 수 있습니다 여전히 long 값을 반환하고, 방지이 원래 Date 객체 :)이 Date가 나타내는

1

이 아마도 당신이 long 밀리 초 값을 반환 할 수의 불변성을 유지 호출자가를 수정하면 Date이 반환됩니다. 그런 다음 호출을 다시 구성 할 수있는 Date 다음 인 IntelliJ의 검사를 통과해야

Date theDate = new Date(myObject.getStartDateMilliseconds()); 

.

+2

날짜가 길습니까? 왝. –