Java: Como evitar aviso depreciado em interfaces de derivados que override obsoleto membros?

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

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top