Почему java.io.Serializable не рекомендуется в Java 5?
В предыдущей версии Java 5 аннотаций не было. В результате вы не можете добавить метаданные в класс.
Чтобы пометить класс как сериализуемый, вы должны были реализовать интерфейс Serializable (это всего лишь маркер) и использовать далее transient
ключевые слова, чтобы пометить поле как не сериализуемое при необходимости, что-то вроде:
public class MyClass implements Serializable {
...
private transient Bla field;
...
}
Теперь вы можете теоретически использовать аннотации (это идеально подходит для них) и иметь:
@Serializable
public class MyClass {
...
@Transient
private Bla field;
...
}
Но интерфейс и ключевое слово не устарели, и в Java 5 не было добавлено примечаний для их замены.
Каковы соображения для этого решения, чтобы сохранить интерфейс и ключевое слово?
Конечно, существует проблема совместимости с кодом до Java 5, но в какой-то момент это закончится (например, в связи с новыми функциями обобщений, JLS указывает, что возможно, что будущие версии языка программирования Java будут запрещать использование сырых видов). Так почему бы не подготовить путь для сериализованных аннотаций?
Какие-нибудь мысли? (хотя я бы предпочел конкретные ссылки:D, которые я не смог найти)
4 ответа
Здесь есть интерфейс, поэтому можно определить методы для приема объектов типа Serializable:
public void registerObject(Serializable obj);
Конечно, существует проблема совместимости с предварительно Java 5 кода...
Да. Это корень проблемы.
Если они
@deprecated
Serializable
интерфейс в (скажем) Java 5, тогда много старого кода до Java 5 будет выдавать предупреждения (или ошибки в зависимости от переключателей компилятора).Там нет ничего на самом деле не так с использованием
Serializable
и "заставлять" людей заменять это раздражает. (У людей есть дела поважнее...)Когда люди "исправят" это в своем коде, он больше не будет компилироваться с использованием компилятора до Java 5 или работать на JVM до Java 5.
Это плохая идея делать вещи, которые заставляют компилятор систематически "плакать волком".
... но в какой-то момент это закончится.
На самом деле, вероятность того, что это действительно произойдет, (ИМО) мала. Насколько я знаю, Sun / Oracle никогда не удаляли устаревшую функцию. Даже не такие опасные, как Thread.stop()
и друзья.
В качестве сноски разработчики Go используют другой подход к этой проблеме. Когда они хотят изменить язык или функцию библиотеки, они просто делают это. Они предоставляют конвертер, который будет автоматически переписывать ваш код по мере необходимости.
Serializable
а также transient
действительно две вещи, которые могли быть заменены аннотациями.
Они не устарели, вероятно, потому что есть много программ, которые используют Serializable
и было бы неприятно миллионам разработчиков, если бы компилятор внезапно начал извергать тысячи предупреждений об устаревании.
В стандартном Java API есть много других вещей, которые давно бы устарели - например, классы устаревшей коллекции Vector
а также Hashtable
(и я уверен, что вы можете легко найти еще много вещей). И есть другие вещи, которые могли бы быть реализованы с помощью аннотаций (например, ключевое слово volatile
, strictfp
а также synchronized
).
Амортизация для вещей, которые активно вредны. То, что вы предлагаете, заставляет авторов восьмилетнего существующего Java-кода (на тот момент) переписать его, без какой-либо выгоды, просто для того, чтобы отключить предупреждения компилятора устаревания, чтобы вернуться к полностью правильному коду, который они имели в Java 1.4., Это не было бы полезно.