Java:Как избежать устаревшего предупреждения в производных интерфейсах, которые переопределяют устаревшие члены?

StackOverflow https://stackoverflow.com/questions/1213362

Вопрос

Рассмотрим следующую упрощенную иерархию наследования интерфейса:

// Starting point:
public interface Base {
    void Foo();
}

public interface Derived extends Base {
}

Он предназначен для перемещения Foo метод из Base интерфейс к Derived интерфейс:

// Desired end-point:
public interface Base {
}

public interface Derived extends Base {
    void Foo();
}

Для поэтапного внесения этого критического изменения желательно сохранить обратную совместимость Base интерфейс на некоторое время.

Это может быть достигнуто путем маркировки метода на Base интерфейс как @Deprecated:

// Intermediate state:
public interface Base {
    /**
     * @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
     */
    @Deprecated void Foo();
}

public interface Derived extends Base {
    void Foo(); 
}

Когда я компилирую этот код, я получаю предупреждение компилятора о Derived:

[устаревание] Foo() в интерфейсной базе устарел

Как ни странно, если я удалю @deprecated из документации в Base (но оставьте @Deprecated) это предупреждение исчезает.

Правильно ли, что я получаю это предупреждение, и если да, то как я могу обойти это?


Предупреждение, по-видимому, сообщает о том, что Derived.Foo является ли "использование" Base.Foo (который устарел).Но единственная емкость, в которой Derived.Foo является ли "использование" устаревшим Base.Foo заключается в том, чтобы переопределить его.Это, по-видимому, говорит о том, что вам не разрешается переопределять устаревшие методы интерфейса в производных методах.

Если это так, должен ли я тогда украсить Derived с @SuppressWarnings("deprecation") чтобы подавить предупреждение?

Это было полезно?

Решение

Я считаю, что ваше требование действительно, я не сомневаюсь, что переопределение устаревшего метода - это правильный путь.

Я считаю, что разница между @deprecated и @Deprecated в основном историческая.@Deprecated - это официальный способ в java 5, но он новый, поэтому ожидается, что мы удвоим его с помощью @deprecated .

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

Не зная больше и зная, что проблема исчезнет, как только вы эффективно удалите super метод, я бы использовал @SuppressWarnings ("устаревание"), возможно, с комментарием для понимания вашими преемниками ...(и еще один комментарий к суперметоду, чтобы сказать им удалить все это при удалении метода).;-)

Другие советы

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

Если вы добавите @Deprecated к производному объявлению Foo (), я считаю, что предупреждение исчезнет.

public interface Derived extends Base {
    @Deprecated void Foo(); 
}

Нет способа выполнить то, что вы хотите.

Устаревание является относительно простым механизмом и не поддерживает этот вариант использования.

Метод устаревания работает так, что все, что ссылается на устаревший метод или поле, генерирует предупреждение.

Единственное исключение - если сам код, использующий устаревший метод / поле, устарел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top