2016-06-16 3 views
1

Почему javax.money.CurrencyUnit не распространяется от java.io.Serializable? Все его подтипов реализации java.io.Serializable, и на вершине, что, если вы хотите использовать его в отображении гибернации, то FindBugs остановит вас (совершенно правильно), потому что:Почему 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 

Означает ли это, что нужно использовать класс JDKCurrencyAdapter в сводном сопоставлении спящего режима? Я бы предпочел использовать интерфейс, но если это невозможно, я буду использовать класс.

+0

возможно потому, что CurrencyUnit является интерфейсом, и он уже расширяет другой интерфейс, поэтому он не может многократно расширять другой интерфейс. Вы всегда можете обернуть их в пользовательский класс и реализовать Serializable. – SnakeDoc

+0

Хороший вопрос, особенно потому, что 'CurrencyUnit' утверждает, что все реализации * должны быть сериализуемыми (на платформах, обеспечивающих сериализацию). * Вы можете задать это по https://github.com/JavaMoney/jsr354-api/pulls – wero

+0

@wero * реализациям * должен быть сериализуемым. Вы заметили, что OP указывает, что все его подтипы действительно расширяют (или реализуют) Serializable, поэтому пользовательские классы OP также должны реализовать Serializable. – SnakeDoc

ответ

7

Статические чеки против Serializable совершенно ненадежны в обоих направлениях. Предупреждения FindBugs здесь благие намерения, но не должны препятствовать вам использовать CurrencyUnit, как и вы сейчас.

Класс может иметь поле

Object aSerializableObject 

и сериализовать, даже если статический тип поля не - до тех пор, как он гарантирует, что ссылки, размещенные в этой области сериализации. Таким образом, статическая проверка на Serializable вызывает ложные негативы.

Он также создает ложные срабатывания; реализация Serializable не гарантирует, что экземпляры сериализуются без исключения; это всего лишь заявление о намерениях дизайна.

Нижняя линия: в то время как она маскируется как функция статической типизации, сериализуемость на самом деле является функцией динамической типизации. Статические проверки (как внутри кода, например <T extends Serializable>, так и внешние проверки, такие как предупреждения FindBugs) являются лишь намеками относительно того, где что-то может пойти не так.

Смежные вопросы