java.util.Date 내부 참조를 노출하지 않도록 복제 또는 복사
개체 (엔티티)의 내부 참조를 노출하지 않는 것이 가장 좋습니다. 따라서 객체에 유형의 필드가있는 경우 java.util.Date
예를 들어이 필드의 getter는 원래 날짜가 아니라 복사본을 반환해야합니다.
그러나 java.util.Date의 경우 해당 복사본을 만드는 두 가지 일반적인 방법이 있습니다.
- 복제 :
(Date) originalDate.clone()
- 생성자를 통해 복사
new Date(originalDate.getTime())
내 질문은 어느 쪽이 더 낫고 그 이유는 무엇입니까?
확실히 그저이면 Date
어느 쪽이든 아무런 차이가 없습니다.
실제 객체가 (예 :) 의 하위 클래스 일 수 있다면 생성자를 호출하면 그렇지 않은 반면 추가 정보 (어떤 클래스인지 포함)는 보존 되기를 바랍니다 .Date
java.sql.Date
clone()
제쳐두고, Joda Time 을 사용했다면 사용할 불변 유형이 많기 때문에이 문제가 발생하지 않을 것입니다. 또한 훨씬 더 나은 API입니다. :)
효과적인 Java를 읽으십시오 . 복사본을 만드는 데 선호되는 방법은 복사 생성자 접근 방식을 사용하는 것입니다.
Bill Venners : 책에서 Cloneable을 구현하고 clone을 작성하는 대신 복사 생성자를 사용하는 것이 좋습니다. 그것에 대해 자세히 설명해 주시겠습니까?
Josh Bloch : 제 책에서 복제에 관한 항목을 읽었다면, 특히 줄 사이를 읽으면 복제가 심하게 망가 졌다는 것을 알게 될 것입니다. 몇 가지 디자인 결함이 있으며 그중 가장 큰 것은 Cloneable 인터페이스에 복제 방법이 없다는 것입니다. 그리고 그것은 단순히 작동하지 않는다는 것을 의미합니다. 무언가를 복제 가능하게 만드는 것은 그것으로 할 수있는 것에 대해 아무 말도하지 않습니다. 대신 내부적으로 할 수있는 일에 대해 설명합니다. super.clone을 반복해서 호출하여 Object의 clone 메서드를 호출하면이 메서드는 원본의 필드 복사본을 반환합니다.
방어 적으로 코딩하는 경우 복사 생성자가 필요합니다. Effective Java의이 구절을 참조하십시오 .
또한 방어 복사본을 만들기 위해 Date의 복제 방법을 사용하지 않았습니다. Date가 최종 값이 아니기 때문에 clone 메소드는 클래스가 java.util.Date 인 객체를 반환한다고 보장 할 수 없습니다. 악의적 인 장난을 위해 특별히 설계된 신뢰할 수없는 하위 클래스의 인스턴스를 반환 할 수 있습니다. 예를 들어 이러한 하위 클래스는 생성시 개인 정적 목록에 각 인스턴스에 대한 참조를 기록하고 공격자가이 목록에 액세스하도록 허용 할 수 있습니다. 이것은 공격자에게 모든 인스턴스에 대한 자유로운 통치를 제공합니다. 이러한 종류의 공격을 방지하려면 복제 메서드를 사용하여 신뢰할 수없는 당사자가 유형을 하위 클래스로 분류 할 수있는 매개 변수의 방어 복사본을 만들지 마십시오.
'development' 카테고리의 다른 글
가장 비싼 쿼리를 어떻게 기록하고 찾을 수 있습니까? (0) | 2020.11.21 |
---|---|
Django-모델 그래픽 표현 (ERD) (0) | 2020.11.21 |
인앱 결제 테스트 : "게시자가이 항목을 구매할 수 없습니다." (0) | 2020.11.21 |
"yield from"문을 Python 2.7 코드로 변환 (0) | 2020.11.21 |
파이썬에서 % timeit은 무엇입니까? (0) | 2020.11.21 |