Почему javax.money.CurrencyUnit не сериализуем?
Почему javax.money.CurrencyUnit
не простираться от java.io.Serializable
? Все его подтипы реализуют java.io.Serializable
И, кроме того, если вы хотите использовать его в своем отображении гибернации, то findbugs остановит вас (совершенно правильно), потому что:
[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
в своем спящем отображении? Я бы предпочел использовать интерфейс, но если это невозможно, я буду использовать класс.
1 ответ
Статические проверки против Serializable
абсолютно ненадежны в обоих направлениях. Предупреждения FindBugs здесь благими намерениями, но не должны мешать вам использовать CurrencyUnit
как ты сейчас.
У класса может быть поле
Object aSerializableObject
и быть сериализуемым, даже если статический тип поля - нет - при условии, что ссылки, размещенные в этом поле, являются сериализуемыми. Так что статическая проверка против Serializable
производит ложные негативы.
Это также производит ложные срабатывания; реализации Serializable
не является гарантией того, что экземпляры будут сериализованы без исключения; это просто заявление о намерении проекта.
Итог: несмотря на то, что он маскируется как функция статической типизации, в действительности сериализуемость является функцией динамической типизации. Статические проверки (будь то внутри кода, такие как <T extends Serializable>
или внешние проверки, такие как эти предупреждения FindBugs) - это просто подсказки о том, где что-то может пойти не так.