Java: Como evitar aviso depreciado em interfaces de derivados que override obsoleto membros?
-
06-07-2019 - |
Pergunta
Considere a seguinte hierarquia de interface inheritence simplificado:
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
Pretende-se para mover o método Foo
a partir da interface Base
à interface Derived
:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
A fim de fase nesta alteração de quebra, é desejado para manter a compatibilidade com versões anteriores da interface Base
por algum tempo.
Isto pode ser conseguido através da marcação do método na interface Base
como @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();
}
Quando eu compilar este código eu recebo um aviso do compilador para Derived
:
[depreciação] Foo () na interface de base ter sido preterido
Curiosamente, se eu remover o @deprecated
da documentação em Base
(mas deixar o @deprecated) este aviso desaparece.
É verdade que eu recebo este aviso, e em caso afirmativo, como posso resolver isso?
O aviso parece comunicar que Derived.Foo
está "usando" Base.Foo
(que é obsoleto). Mas a única qualidade em que Derived.Foo
está "usando" o Base.Foo
deprecated é substituí-lo. Isso parece dizer que você não tem permissão para substituir métodos de interface obsoleto em métodos derivados.
Se este for o caso, devo Derived
Em seguida, decore com @SuppressWarnings("deprecation")
para suprimir o aviso?
Solução
Eu acredito que sua exigência é válida, não tenho dúvida de que substituindo o método obsoleto é a maneira correta para ir.
Eu acredito que a diferença entre @deprecated e @deprecated é principalmente histórica. @Deprecated é a forma oficial em Java 5, mas é novo, por isso espera-se que dobrá-lo com @deprecated.
Observe também que, infelizmente, @deprecated não permite que você especifique informações .. enquanto a informação é geralmente necessária, por exemplo, para dizer o que deve ser usado como um substituto, ou quando o método deprecated é esperado para ser completamente removido .
Não sabendo mais, e sabendo que o problema vai desaparecer assim que você efetivamente remover o método super, eu usaria as @SuppressWarnings ( "descontinuação"), possivelmente com um recado para seus sucessores entender ... (e outra comentário sobre o método super para dizer-lhes para remover tudo o que ao excluir o método). ; -)
Outras dicas
Se bem entendi, você precisa de um @SuppressWarnings ( "descontinuação") no início de suas classes que implementam a interface / função obsoleta. Ou sou maneira que eu fora da base aqui?
Se você adicionar @deprecated à sua declaração derivada de Foo () Eu acredito que o aviso vai embora.
public interface Derived extends Base {
@Deprecated void Foo();
}
Não há nenhuma maneira de conseguir o que deseja.
Deprecation é um mecanismo relativamente simples e não suporta este caso de uso.
A maneira que depreciação funciona é que qualquer coisa que faz referência a um método obsoleto ou campo gera um aviso.
A única exceção é se o código usando o método / campo deprecated é obsoleto em si.