Java: ¿Cómo evitar advertencias obsoletas en interfaces derivadas que anulan a miembros obsoletos?

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

Pregunta

Considere la siguiente jerarquía de herencia de interfaz simplificada:

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

public interface Derived extends Base {
}

Se pretende mover el método Foo de la interfaz Base a la interfaz Derivada :

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

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

Para realizar la fase de este cambio radical, se desea conservar la compatibilidad con la interfaz Base hacia atrás por algún tiempo.

Esto se puede lograr marcando el método en la interfaz 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(); 
}

Cuando compilo este código, recibo una advertencia del compilador para Derived :

  

[deprecation] Foo () en la interfaz Base ha quedado en desuso

Curiosamente, si elimino el @deprecated de la documentación en Base (pero dejo el @Deprecated) esta advertencia desaparece.

¿Es correcto que reciba esta advertencia, y si es así, cómo puedo solucionar esto?


La advertencia parece comunicar que Derived.Foo está " usando " Base.Foo (que está en desuso). Pero la única capacidad en la que Derived.Foo está " usando " el Base.Foo en desuso es anularlo. Eso parece decir que no puede anular los métodos de interfaz obsoletos en los métodos derivados.

Si este es el caso, ¿debería decorar Derivado con @SuppressWarnings (" deprecation ") para suprimir la advertencia?

¿Fue útil?

Solución

Creo que su requisito es válido, no tengo dudas de que anular el método obsoleto es la forma correcta de hacerlo.

Creo que la diferencia entre @deprecated y @Deprecated es principalmente histórica. @Deprecated es la forma oficial en Java 5, pero es nuevo, por lo que se espera que lo dupliquemos con @deprecated.

También tenga en cuenta que, lamentablemente, @Deprecated no le permite especificar información ... mientras que generalmente se necesita información, por ejemplo, para saber qué se debe usar como reemplazo, o cuándo se espera que el método obsoleto se elimine por completo .

Sin saber más, y sabiendo que el problema desaparecerá tan pronto como elimine el súper método, usaría @SuppressWarnings (" deprecation "), posiblemente con un comentario para que sus sucesores lo comprendan ... (y otro comentario sobre el súper método para decirles que eliminen todo eso al eliminar el método). ;-)

Otros consejos

si entiendo correctamente, necesita un @SuppressWarnings (" deprecation ") al comienzo de sus clases que implementan la interfaz / función en desuso. ¿O estoy fuera de lugar aquí?

Si agrega @Deprecated a su declaración derivada de Foo (), creo que la advertencia desaparecerá.

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

No hay forma de lograr lo que quieres.

La desaprobación es un mecanismo relativamente simple y no es compatible con este caso de uso.

La forma en que funciona la desaprobación es que todo lo que hace referencia a un método o campo desaprobado genera una advertencia.

La única excepción es si el código que usa el método / campo en desuso está en desuso en sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top