Справка по функции Java-функции, используйте @Deprecated?

Сценарий:
Java 1.6

class Animal { 
    private String name; 
    ...  
    public String getName() { return name; }  
    ...
}

class CatDog extends Animal {
    private String dogName;
    private String catName;
    ...
    public String getDogName() { return dogName; }
    public String getCatName() { return catName; }
    public String[] getNames() { return new String[]{ catName, dogName }; }
    ...
    public String getName() { return "ERROR! DO NOT USE ME"; }
}

Проблема:
getName не имеет смысла и не должен использоваться в этом примере. Я читаю о @Deprecated аннотации. Есть ли более подходящий метод аннотации?

Вопросы:
A) Можно ли принудительно вызвать ошибку, когда эта функция используется (до запуска)?
B) Есть ли способ отобразить настроенное предупреждение/сообщение об ошибке для метода аннотации, который я буду использовать? В идеале, когда пользователь зависает над функцией устаревших/ошибок.

Ответы

Ответ 1

Как правило, вы используете @Deprecated для методов, которые были устарели более новой версией вашего программного обеспечения, но которые вы поддерживаете для совместимости API с кодом, который зависит от старой версии. Я не уверен, что это лучший тег для использования в этом сценарии, потому что getName по-прежнему активно используется другими подклассами Animal, но он обязательно предупредит пользователей класса CatDog, которые они не должны вызывать этот метод.

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

Однако, конечно, возможно отобразить пользовательское сообщение, когда пользователь наводится на устаревший метод. Тег Javadoc @deprecated позволяет указать объяснение, почему метод был устаревшим, и он появится вместо обычного описания метода, когда пользователь наводится на этот метод в среде IDE, например Eclipse. Это будет выглядеть так:

/**
 * 
 * @deprecated Do not use this method!
 */
 @Deprecated
 public String getName() {
     throw new UnsupportedOperationException();
 }

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

Ответ 2

Устаревание означает, что метод больше не должен использоваться и что он может быть удален в будущих выпусках. В принципе именно то, что вы хотите.

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

Если вы хотите создать настраиваемое сообщение, когда кто-то наводит курсор на этот метод, используйте javadoc для него, что именно он там:

/**
     * @deprecated
     * explanation of why function was deprecated, if possible include what 
     * should be used.
     */

Ответ 3

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

В Eclipse, чтобы настроить Ошибки и предупреждения, перейдите в Window → Preferences. В разделе Java → Compiler → Errors/Warnings вы увидите раздел для устаревших API. Вы можете дать указание компилятору игнорировать, предупреждать или ошибочно, когда метод устарел. Конечно, если вы работаете с другими разработчиками, им придется настроить их компилятор таким же образом.