Java: come evitare gli avvisi obsoleti nelle interfacce derivate che sovrascrivono i membri obsoleti?
-
06-07-2019 - |
Domanda
Considera la seguente gerarchia di ereditarietà dell'interfaccia semplificata:
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
È destinato a spostare il metodo Foo
dall'interfaccia Base
all'interfaccia Derivata
:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
Al fine di eliminare gradualmente questa modifica, si desidera mantenere per qualche tempo la retrocompatibilità dell'interfaccia Base
.
Ciò può essere ottenuto contrassegnando il metodo sull'interfaccia Base
come @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 compilo questo codice ricevo un avviso di compilatore per Derived
:
[deprecation] Foo () nell'interfaccia Base è stato deprecato
Stranamente, se rimuovo il @deprecated
dalla documentazione in Base
(ma lascio il @Deprecated) questo avviso scompare.
È corretto ricevere questo avviso e, in caso affermativo, come posso aggirare questo?
L'avviso sembra comunicare che Derived.Foo
sta " usando " Base.Foo
(che è obsoleto). Ma l'unica capacità in cui Derived.Foo
è " usando " il Base.Foo
obsoleto è quello di sovrascriverlo. Ciò sembra dire che non ti è permesso di sostituire i metodi di interfaccia obsoleti nei metodi derivati.
In questo caso, dovrei quindi decorare Derived
con @SuppressWarnings (" deprecation ")
per sopprimere l'avviso?
Soluzione
Credo che il tuo requisito sia valido, non ho dubbi sul fatto che l'override del metodo deprecato sia la strada giusta da percorrere.
Credo che la differenza tra @deprecated e @Deprecated sia principalmente storica. @Deprecated è il modo ufficiale in java 5, ma è nuovo, quindi dovremmo raddoppiarlo con @deprecated.
Si noti inoltre che, purtroppo, @Deprecated non consente di specificare le informazioni .. mentre le informazioni sono generalmente necessarie, ad esempio per dire cosa dovrebbe essere usato in sostituzione o quando si prevede che il metodo obsoleto dovrebbe essere completamente rimosso .
Non sapendo di più e sapendo che il problema scompare non appena avessi rimosso efficacemente il super metodo, utilizzerei @SuppressWarnings ("quotazione di deprecazione"), possibilmente con un commento per far capire ai tuoi successori ... (e un altro commento sul super metodo per dire loro di rimuovere tutto ciò quando si elimina il metodo). ; -)
Altri suggerimenti
se ho capito bene, hai bisogno di un @SuppressWarnings ("quotation deprecation") all'inizio delle tue classi che implementano l'interfaccia / funzione deprecata. O sono lontano dalla base qui?
Se aggiungi @Deprecated alla tua dichiarazione derivata di Foo () credo che l'avvertimento sparirà.
public interface Derived extends Base {
@Deprecated void Foo();
}
Non c'è modo di realizzare ciò che vuoi.
La deprecazione è un meccanismo relativamente semplice e non supporta questo caso d'uso.
Il modo in cui funziona la deprecazione è che tutto ciò che fa riferimento a un metodo o campo deprecato genera un avviso.
L'unica eccezione è se il codice che utilizza il metodo / campo deprecato è deprecato stesso.