Устаревать только наследование классов - PullRequest
7 голосов
/ 14 февраля 2011

Я бы не хотел использовать только расширение данного класса, а не все методы и поля, содержащиеся в классе, используя аннотацию @Deprecated.

То есть предупреждение будет появляться, если вы расширяете данный класс - но ссылки на методы или поля не вызовут предупреждение. Уже существует несколько классов, расширяющих этот класс, и я хочу, чтобы предупреждения об устаревании предназначались для этих клиентов - я пока не могу их сломать (но их можно перекомпилировать - совместимость с ABI не требуется).

Возможно ли это в Java 1.6 (JDT-компилятор)?

Ответы [ 5 ]

5 голосов
/ 14 февраля 2011

Два соображения

1) Возможно, класс уже расширен, поэтому не помечайте его как окончательный, иначе вы можете нарушить обратную совместимость.

2) Вы не хотите расширять класс, поэтому он должен быть помечен как окончательный.

Я думаю, что вам следует расширить старый класс новым классом, пометить старый класс как устаревший и объявить новый класс финальным.В новом классе вы можете добавить тег @SuppressWarning, чтобы успокоить устаревшее сообщение, а затем получить чистую компиляцию.

Код, использующий старый класс, получит предупреждение @Deprecated, но все равно будет компилироватьсяКод с использованием нового класса будет скомпилирован без ошибок.Это своего рода «сильное предложение» для ваших пользователей вместо обратной совместимости, и их довольно легко исправить, поскольку API на 100% совместим.

4 голосов
/ 14 февраля 2011

Я сомневаюсь, что это возможно, используя аннотацию @Deprecated.

Если у вас есть контроль над источниками, вы можете сделать следующее:

  1. Переименовать текущий класс SomeClass в SomeClassSuper
  2. Создайте новый класс с именем SomeClass и дайте ему расширяться SomeClassSuper.
  3. Сделать SomeClass окончательным (что не позволяет клиентам расширять его).

То есть перейдите от

class SomeClass {
    // ...
}

class SubClass extends SomeClass {
    // ...
}

до

class SomeClassSuper {
    // ...
}

class SubClass extends SomeClassSuper {
    // ...
}

final class SomeClass extends SomeClassSuper {
    // ...
}
1 голос
/ 14 февраля 2011

Если это соответствует вашему дизайну, вы, возможно, могли бы сделать необходимые функции (например, конструкторы, к которым должны иметь доступ потомки) частными, и предоставить защищенный + устаревший конструктор, который расширения должны использовать.

1 голос
/ 14 февраля 2011

Нет, ни за что.Вы можете создать класс final, но, таким образом, вы сломаете существующие расширения.

Возможно, это возможно, если разработать собственный процессор для APT.Но оно не будет применено в общем случае.

0 голосов
/ 14 февраля 2011

Аннотация @Deprecated не поддерживает это, вы должны пометить свой класс final. Хотя это вызывает ошибку компилятора, это более логично, либо безопасно расширять свой класс, либо делать это является ошибкой.

...