2016-06-16 3 views
1

javax.money.CurrencyUnitjava.io.Serializable에서 연장되지 않습니까?javax.money.CurrencyUnit이 Serializable이 아닌 이유는 무엇입니까?

[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field defaultCurrency [com.mycompany.SiteEntity] In SiteEntity.java 
[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field supportedCurrencies [com.mycompany.SiteEntity] In SiteEntity.java 
[INFO] Class com.mycompany.UserEntity defines non-transient non-serializable instance field sessionCurrency [com.mycompany.UserEntity] In UserEntity.java 

이 하나가를 사용해야한다는 뜻 : 때문에 부속 유형의 모든 java.io.Serializable을 구현하고, 당신이 당신의 최대 절전 모드 매핑에 사용하려는 경우 그 꼭대기에, 다음 findbugs는 (매우 정확하게) 당신을 막을 것 최대 절전 모드 매핑에서 클래스 JDKCurrencyAdapter? 차라리 인터페이스를 사용하는 편이 낫지 만 가능하지 않다면 클래스를 사용합니다.

+0

아마도 CurrencyUnit은 인터페이스이기 때문에 다른 인터페이스를 확장하므로 이미 다른 인터페이스를 확장 할 수 없습니다. 사용자 지정 클래스에서 항상 래핑 할 수 있으며 Serializable을 구현할 수 있습니다. – SnakeDoc

+0

좋은 질문입니다. 특히 CurrencyUnit은 모든 구현이 직렬화 가능해야한다고 말합니다. (serialization을 제공하는 플랫폼에서) * https://github.com/JavaMoney/jsr354-api/pulls에서이 질문을 할 수 있습니다. – wero

+0

@wero * 구현 *는 직렬화 가능해야합니다. OP의 주목할 점은 모든 하위 유형이 실제로 Serializable을 확장 (또는 구현)하므로 OP의 사용자 정의 클래스가 Serializable을 구현해야한다는 점입니다. – SnakeDoc

답변

7

Serializable에 대한 정적 검사는 양방향에서 완전히 신뢰할 수 없습니다. 여기에있는 FindBugs 경고는 선의로 작성되었지만 지금 그대로 CurrencyUnit을 사용하지 못하게해서는 안됩니다.

클래스는 필드

Object aSerializableObject 

을 가지고 필드의 정적 형식이 아닌 경우에도, 직렬화 할 수 있습니다 - 오래가이 분야에 배치 참조가 직렬화하도록 보장한다. 따라서 Serializable에 대한 정적 검사는 잘못된 음수를 생성합니다.

또한 위양성을 생성합니다. Serializable을 구현한다고해서 인스턴스가 예외없이 serialize되는 것은 아닙니다. 그것은 단순히 설계 의도에 관한 진술 일뿐입니다.

결론 : 정적 유형 지정 기능으로 가장하는 반면 직렬 기능은 실제로 동적 유형 지정 기능입니다. 정적 검사 (<T extends Serializable> 같은 코드 내에서나 FindBugs 경고와 같은 외부 검사)는 잘못된 부분에 대한 힌트 일뿐입니다.