2009-08-12 17 views
9

Per la programmazione Java, quali sono alcuni vantaggi dell'utilizzo della notazione @Deprecated su e del metodo di interfaccia ma non della classe che lo implementa?Quali sono i vantaggi dell'utilizzo della notazione @Deprecated solo sull'interfaccia?

public interface Joe { 

    @Deprecated 
    public void doSomething(); 

    ... 
} 

public final class Joseph implements Joe { 

    public void doSomething() { 
     ... 
    } 

    ... 
} 
+0

Perché dovresti anche svalutare il metodo -only- in un'interfaccia? Basta inserire nei documenti di rilascio che "Interfaccia" Joe "non è stata utilizzata per l'uso". o qualcosa. – Zack

+0

Esistono altri metodi per l'interfaccia e la classe. Scusa Zack per la confusione. –

risposta

8

Credo sia una lacuna nel linguaggio Java stesso e non ha senso specificare un metodo in un'interfaccia come deprecato tramite un'annotazione e non avere il metodo considerato deprecato nella classe di implementazione.

Sarebbe meglio se venissero ereditate le @ deprecated-ness del metodo. Sfortunatamente, sembra che Java non supporti questo.

Considerare come la gestione degli strumenti, ad esempio un IDE, tratti questa situazione: se il tipo di una variabile viene dichiarato come interfaccia, i metodi @deprecated possono essere visualizzati con un attacco. Ma se il tipo di una variabile è dichiarata come la classe di implementazione e la firma della classe non include @deprecated, il metodo sarà reso senza un avvertimento.

La domanda fondamentale è: cosa significa che un metodo deve essere deprecato in un'interfaccia ma non in una classe di implementazione (o in un'interfaccia estesa)? L'unica ragione ragionevole è che il metodo sia deprecato per tutto ciò che si trova sotto l'interfaccia nella gerarchia delle classi. Ma la lingua non supporta questo comportamento.

6

a mio parere è controverso: un'interfaccia metodo deprecato non non deve essere utilizzato a prescindere la sua implementazione (si prega di fornire controesempi se non)

+0

Sarei più che controverso: direi che è discutibile. Sicuramente chiederei che fosse giustificato in una revisione del codice. – CPerkins

+1

Perché no? Ciò significa semplicemente che un metodo nell'interfaccia multi-metodo è pianificato per essere rimosso nelle versioni future. –

+0

@Eugene: potrebbe essere vero, ma l'esempio mostrava solo un metodo. Quindi, perché ha anche quell'interfaccia se ha solo un metodo?:/lol – Zack

11

@deprecated è la documentazione. Se le persone eseguono il codice su un'interfaccia, è possibile contrassegnare alcuni aspetti di tale interfaccia come deprecati. In questo modo le persone sanno di non usarlo.

La classe di implementazione dell'interfaccia è un dettaglio. Un metodo in quella classe capita di soddisfare l'interfaccia ma non può essere deprecato da solo. Il sopprimere tale metodo potrebbe o non essere appropriato.

Creazione di una nuova classe che implementa un'interfaccia significa che è necessario implementare i metodi deprecati. Probabilmente dovrebbero funzionare a meno che non si sappia che i client della classe non usano i metodi deprecati. Ad esempio, se si sta creando un contenitore di servlet HTTP è necessario implementare il metodo HttpServletResponse.encodeUrl() anche se è deprecato a favore di encodeURL(). Questo perché un utente della tua classe può chiamare quel metodo deprecato.

+0

Espansione su "Decrittando che il metodo [implementazione] possa o meno essere appropriato." In particolare, può darsi che il metodo di interfaccia doSomething non sia appropriato per tutte le implementazioni di Joe, ma sia appropriato per questa particolare implementazione Joseph - quindi la deprecazione nell'interfaccia ma non in questa particolare implementazione. – drew

0

Se vogliamo rifattorizzare il codice esistente con metodi inappropriati nell'interfaccia e nell'implementazione, allora possiamo usare @Deprecated nei metodi di interfaccia a favore di nuovi metodi puliti temporaneamente per alcune versioni. Potrebbe essere brutto, solo per mantenere il codice compatibile all'indietro, possiamo usarlo. Questo mostrerà nel report IDE e SONAR che è un metodo deprecato e costringe i client a utilizzare nuovi metodi.

Problemi correlati