2009-03-13 9 views
133

Oggi ho utilizzato la funzione di refactoring di "interfaccia di pull" di Eclipse per creare un'interfaccia basata su una classe esistente. La finestra di dialogo ha offerto di creare tutti i nuovi metodi della nuova interfaccia come metodi "astratti".Perché si dichiara un metodo di interfaccia Java astratto?

Quale sarebbe il vantaggio di questo?

Ho pensato che il fatto che fosse consentito dichiarare i metodi di interfaccia come astratti era una caratteristica superflua e innocua del linguaggio che non è particolarmente incoraggiata.

Perché Eclipse supporta un tale stile o perché qualcuno dovrebbe scegliere volontariamente di farlo?

Precisazione: non sto chiedendo perché i metodi di interfaccia sono astratti, è ovvio. Sto chiedendo perché si dovrebbe scegliere esplicitamente di contrassegnarli come astratti poiché se sono nell'interfaccia sono comunque astratti.

risposta

140

In base allo Java Language Specification, la parola chiave abstract per le interfacce è obsoleta e non dovrebbe più essere utilizzata. (Sezione 9.1.1.1)

Detto questo, con la propensione di Java per la compatibilità con le versioni precedenti, dubito davvero che farà mai la differenza se la parola chiave abstract è presente.

+1

Questa era la mia comprensione (anche se non avevo familiarità con la sezione specifica di JLS). Mi chiedo perché Eclipse mi avrebbe offerto la possibilità di creare una marcatura obsoleta ... – Uri

+0

Fammi vedere. Qualcuno da qualche parte deve aver deciso che era una "caratteristica" desiderabile e lo ha inserito. Sapete, uno di quegli astuti tipi open source :) – jdmichal

+2

tsk tsk ... Senza un avviso che è obsoleto ... – Uri

9

In base ai metodi JLS nelle interfacce sono astratti per impostazione predefinita, quindi la parola chiave è ridondante. Sapendo questo, non lo userei mai per "evitare confusione nella presentazione".

+0

Questa dovrebbe essere la risposta giusta. Ecco un aggiornamento [collegamento] (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) - vedere la sezione "note" – mork

+0

Il JLS non dice che la parola chiave è obsoleta per i metodi nelle interfacce. Dice "È permesso, ma scoraggiato come questione di stile, specificare in modo ridondante il modificatore pubblico e/o astratto per un metodo dichiarato in un'interfaccia." [JLS # 9.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4). – EJP

+0

@EJP Non ho detto che il JLS ha dichiarato che la parola chiave sarebbe stata obsoleta, questa era la mia opinione personale;) BTW nota che questa parola chiave è "ridondante" che non è esattamente la stessa di quella obsoleta, in questo hai ragione corso. Ora so che modificherò la risposta per chiarire questo. – dhiller

38

"Il beneficio di quella" (aggiungendo astratto nei metodi di interfaccia dichiarazione) in eclisse sarebbe un vecchio problema di compatibilità con jdt eclipse compiler in jdk1.3

Da 1.4, librerie JDK non sono più contenente metodi astratti predefiniti (su classi astratte implementazione di interfacce).
Questa è una simulazione del compilatore di Eclipse 1.3 poiché la loro implementazione si basa sulla loro esistenza.
Si noti che Javac 1.3 rifiuterebbe del tutto di funzionare contro 1,4 librerie (usando l'opzione -bootclasspath).

Dal momento che il compilatore Eclipse è probabile che sia in 1,4 livello di conformità (vedi Workbench>Preferences>Java>Compiler>JDK Compliance), oppure utilizzare almeno 1,3 librerie di classi se si utilizza 1,3 modalità di conformità, la presenza di "astratto" non è necessario nella maggior parte della corrente progetti di eclissi.

+3

Buona scoperta. Quindi è la funzionalità per aggirare un problema inesistente nel compilatore Eclipse. – jdmichal

+1

@jdmichal: esattamente, ed è anche una risposta più accurata alla domanda di Uri. – VonC

34

Da Java SE 7 JLS (Java Language Specification): "È consentito, ma scoraggiato come questione di stile, specificare in modo ridondante il modificatore pubblico e/o astratto per un metodo dichiarato in un'interfaccia."

Per Java SE 5.0: "Per compatibilità con le versioni precedenti della piattaforma Java, è consentito ma scoraggiato, in termini di stile, di specificare in modo ridondante il modificatore astratto per i metodi dichiarati nelle interfacce."