2016-04-25 2 views
6

Я нашел что-то странное в Eclipse IDE. Скажем, у меня есть следующие классы:Отклонения по методу переопределения

public class Super { 
    @Deprecated 
    public void doNotUseThisMethod() { 
     // do magic 
    } 
} 

public class Sub extends Super{ 
    @Override 
    public void doNotUseThisMethod() { 
     // why is this not deprecated? 
    } 
} 

Конечно переопределение устаревшего метода должен привести к предупреждению (потому что по той же причине, что не его использования относится). Все еще в новых рабочих пространствах для Eclipse Luna и Mars приведенный выше код не дает предупреждения вообще. И я не могу найти способ ее включить.

Я нашел this bug для интерфейсов (я понимаю, что если Super был интерфейсом, не должно быть предупреждения), что подразумевает, что было предупреждение один раз.

Итак, что случилось? Есть ли какая-либо причина, исключающая устаревший метод, не должна приводить к предупреждению? Могу ли я сделать что-то, чтобы снова включить эту функциональность?

+0

Извините за недоразумение в комментариях. Я нашел правду и отправил вам новый ответ. –

ответ

4

JLS вполне понятен в этой точке (как и в большинстве точек).

Программный элемент, аннотированный @Deprecated - это тот, который программистам не рекомендуется использовать, как правило, потому что это опасно или потому, что существует лучшая альтернатива.

Компилятор Java должен вызывать предупреждение об устаревании, когда тип, метод, поле или конструктор, чье объявление аннотируется с помощью @Deprecated, используется (переопределено, вызывается или ссылается по имени) в конструкции, которая явно или неявно объявлена , если:

  • использование находится в пределах объекта, который сам аннотацию с аннотаций @Deprecated; или

  • Использование в сущности, аннотированной для подавления предупреждения с помощью аннотации @SuppressWarnings («устаревание»); или

  • Использование и декларация находятся в пределах одного и того же самого внешнего класса.

(https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.6)

Для полной совместимости с JLS, Eclipse, сусла марки вашего doNotUseThisMethod() с предупреждением. И, похоже, это было так давно, но в 2003 году появилось bug 48335, и это предупреждение стало предпочтительным. Значение по умолчанию, как указано в комментариях к ошибкам, отключено. (Значение по умолчанию должно быть «включено» для того, чтобы быть даже удаленно совместимым с JLS. Не стесняйтесь записывать ошибку, чтобы изменить ее.) Я не выполнял исчерпывающий поиск, но поскольку вы видите поведение, совместимое с этим, я собираюсь выйти на конечность и сказать, что так оно и осталось.

Поскольку это предпочтение, вы можете изменить его. Просто зайдите в «Window -> Preferences», затем выберите «Java -> Compiler -> Errors/Warnings». Прокрутите страницу вниз до «Устаревший и ограниченный API» и установите флажок «Переопределение сигнала или реализация устаревшего метода». Там выпадающий справа и чуть выше, где вы можете выбрать «Ошибка», «Предупреждение» или «Игнорировать». Выберите тот, который вы предпочитаете.

Этот параметр влияет только на локальную среду IDE.

Чтобы получить всю команду, использующую этот параметр, вам необходимо установить параметры проекта. На этом же экране предпочтений в правом верхнем углу находится ссылка на «Настройка параметров проекта». Щелкните по нему, выберите проект, для которого вы хотите установить настройки, и выполните то же самое, что описано выше. Это создаст файл с именем «org.eclipse.jdt.core.prefs» в папке «.settings» вашего проекта. (Вы не можете увидеть их в Проводнике пакетов. Вам нужно будет посмотреть их в представлении «Навигатор».) После создания вы можете добавить их в свой исходный элемент управления, и они будут применяться ко всем в вашей команде, работающим над этим проект.

Да, вы должны сделать это для каждого проекта.

-3

вам нужно @SuppressWarnings ("deprecation") в начале ваших классов, которые реализуют устаревший интерфейс/функцию.

2

На самом деле поведение кажется правильным для меня: когда вы переопределяете метод, это символ, который вы реализуете для него новый код.


Чтобы избежать ошибок, если вы используете устаревший супер метод, затмение поднимет предупреждение:

class Sub extends Super{ 
    @Override 
    public void doNotUseThisMethod() { // <---------------* 
     super.doNotUseThisMethod(); // deprecated! <----* 
    } 
} 

Но если переопределить устаревший метод функциональность, без использования устаревшего super.method() тогда нового метода не устарел по определению, потому что вы внедрили его без использования старого.

public class Sub extends Super{ 
    @Override 
    public void doNotUseThisMethod() { 
     // new logic + not using super.method() = not a deprecated method!! 
    } 
} 

Если один, который отменяет устаревшее один, не следует использовать, должны быть также аннотированный, как нежелателен следующим образом:

public class Super {  
    @Deprecated 
    public void doNotUseThisMethod() { 
     // do magic 
    } 
} 

public class Sub extends Super{ 
    @Override 
    @Deprecated // <---------------------------* 
    public void doNotUseThisMethod() { //  | 
     // this is deprecated also!!!! // <-----* 
    } 
} 

Sidenote: Другой вопрос, будет ли имя ваш метод может вызвать путаницу.


Но не @Deprecate также означать «мы собираемся удалить этот метод в ближайшее время», который нарушит код подкласс, благодаря аннотации @Override? (Именно поэтому мне нужно предупреждение -.., Чтобы другие разработчики переопределения метода я собираюсь удалить Но, как это они не будут даже получить предупреждение) - Штеффи С.

На самом деле может быть, разработчики удаляют этот метод, но усталость - это больше не использование кода в некотором методе, потому что он старый, а затем разработчики делают NEW, с новым именем и оставляют устаревшим как устаревшее.

Но ... Что произойдет в случае удаления этого метода?

Прежде всего, это означало бы изменение версии Java (или фреймворка или utils), это должно быть сделано тщательно, устаревшие методы не будут вашей единственной проблемой.

В случае, если вы выберете основную версию и некоторые устаревшие методы будут удалены, у вас не будет большой проблемы ... Почему? В вашей среде IDE будут четко отмечены эти методы с ошибкой, и вам просто нужно удалить аннотацию @Override, используя вашу логику в своем методе overriden.

+0

Но не '@ Deprecate' также означает« мы скоро удалим этот метод », что приведет к нарушению кода подкласса благодаря аннотации' @ Override'? (Именно поэтому мне нужно предупреждение - чтобы другие разработчики не переопределили метод, который я собираюсь удалить, но так оно и не получит предупреждения.) –

+0

nono, '@ Устаревшие' не означает это, если нет, вы не найдете методы java 1 в java 8 api ... –

+0

@ ErickG.Hagstrom Это неправда. «@ Override» без фактического метода переопределения дает ошибку компилятора. –