불변 객체에 대한 인터페이스를 선언하지 마십시오
[편집] 해당 객체가 DTO (Data Transfer Object) 또는 POD (Plain Old Data)를 나타내는 경우
합리적인 지침입니까?
지금까지 변경 불가능한 봉인 클래스에 대한 인터페이스를 만들었습니다 (데이터를 변경할 수 없음). 불변성에 관심이있는 곳에서는 인터페이스를 사용하지 않도록 조심하려고 노력했습니다.
불행히도, 인터페이스가 코드에 퍼지기 시작합니다 (그리고 내가 걱정하는 코드는 아닙니다). 인터페이스가 전달 된 다음 전달 된 것이 불변이라고 가정하려는 코드로 전달하려고합니다.
이 문제로 인해 불변의 객체에 대한 인터페이스를 선언하지 않는 것을 고려하고 있습니다.
이것은 단위 테스트와 관련하여 파급 효과가있을 수 있지만 그 외에는 합리적인 지침으로 보입니까?
아니면 내가보고있는 "확산 인터페이스"문제를 피하기 위해 사용해야하는 다른 패턴이 있습니까?
(나는 여러 가지 이유로이 불변의 객체를 사용하고 있습니다 : 주로 많은 멀티 스레드 코드를 작성하기 때문에 스레드 안전성을 위해; 그러나 메소드에 전달 된 객체의 방어 복사본을 만들 수 없기 때문에 코드가 훨씬 간단 해집니다. 인터페이스를 사용했다면 불변 인 것을 아는 많은 경우가 있습니다. 실제로 인터페이스를 제공하지 않으면 인터페이스를 통해 참조되는 객체의 방어 복사본을 만들 수도 없습니다. 복제 작업 또는 직렬화 방법 ...)
[편집하다]
객체를 불변으로 만들고 싶은 이유에 대해 더 많은 컨텍스트를 제공하려면 Eric Lippert의이 블로그 게시물을 참조하십시오.
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
또한 멀티 스레드 작업 대기열에서 조작 / 전달되는 항목과 같은 하위 수준 개념으로 작업하고 있음을 지적해야합니다. 이들은 본질적으로 DTO입니다.
또한 Joshua Bloch 는 그의 책 Effective Java에서 불변 객체를 사용할 것을 권장합니다 .
후속 조치
의견 주셔서 감사합니다. 계속해서이 가이드 라인을 DTO 및 그들의 ilk에 사용하기로 결정했습니다. 지금까지는 잘 작동하지만 일주일 밖에 걸리지 않았지만 여전히 좋아 보입니다.
이것에 관해 내가 묻고 싶은 다른 문제들이 있습니다; 특히 내가 "심해 또는 얕은 불변성"이라고 부르는 것 (딥 및 얕은 복제에서 훔친 명명법)-그것은 또 다른 질문입니다.
List<Number>
저장할 수있는 Integer
, Float
, Long
, BigDecimal
, 등 ... 모두 자신 불변입니다.