Java: come evitare gli avvisi obsoleti nelle interfacce derivate che sovrascrivono i membri obsoleti?

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top