Perché uno dovrebbe dichiarare un metodo di interfaccia Java come astratto?


143

Oggi ho usato la funzione di refactoring "pull interface" di Eclipse per creare un'interfaccia basata su una classe esistente. La finestra di dialogo offriva di creare tutti i nuovi metodi della nuova interfaccia come metodi "astratti".

Quale sarebbe il vantaggio di questo?

Pensavo che il fatto che ti fosse permesso di dichiarare astratti i metodi di interfaccia era una caratteristica superflua e innocua del linguaggio che non è particolarmente incoraggiata.

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

Chiarimento: non sto chiedendo perché i metodi di interfaccia siano astratti, questo è ovvio. Sto chiedendo perché si scelga esplicitamente di contrassegnarli come astratti poiché se sono in un'interfaccia sono comunque astratti.

Risposte:


146

Secondo le specifiche del linguaggio Java , la abstractparola chiave per interfacce è obsoleta e non dovrebbe più essere utilizzata. (Sezione 9.1.1.1)

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


1
Questa era la mia comprensione (sebbene non avessi familiarità con la sezione JLS specifica). Mi chiedo perché Eclipse mi offra la possibilità di creare un marchio obsoleto ...
Uri

Mi ha preso Qualcuno da qualche parte deve aver deciso che fosse una "caratteristica" desiderabile e inserirla. Sai, uno di quegli
astuti

18
Sebbene questa sia la risposta più votata, si riferisce alla sezione errata della specifica; 9.1.1.1 sta descrivendo la abstractparola chiave sulla dichiarazione dell'interfaccia stessa, non sui suoi membri. La risposta di @ Will di seguito è corretta e contiene anche fonti di link valide.
Shaggy Frog,

39

"Il vantaggio di ciò" (aggiunta dell'estratto sulla dichiarazione dei metodi di interfaccia) in eclipse sarebbe un vecchio problema di compatibilità con il compilatore jdt eclipse in jdk1.3

Da 1.4, le librerie jdk non contengono più metodi astratti predefiniti (su classi astratte che implementano interfacce).
Ciò sta ingannando la diagnosi del compilatore Eclipse 1.3 poiché la loro implementazione si basa sulla loro esistenza.
Nota che Javac 1.3 rifiuta del tutto di eseguire contro le librerie 1.4 (usando l'opzione -bootclasspath).

Poiché è probabile che il compilatore Eclipse sia nel livello di conformità 1.4 (vedi Workbench>Preferences>Java>Compiler>JDK Compliance) o usi almeno librerie di classi 1.3 se si utilizza la modalità di conformità 1.3, la presenza di "abstract" non è richiesta nella maggior parte dei progetti eclipse attuali.


3
Buona scoperta. Quindi è funzionalità per aggirare un problema non più esistente nel compilatore Eclipse.
jdmichal,

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

39

Da Java SE 7 JLS (Java Language Specification): "È consentito, ma scoraggiato come una 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, è permesso ma scoraggiato, per motivi di stile, specificare ridondante il modificatore astratto per i metodi dichiarati nelle interfacce."


9

Secondo i metodi JLS nelle interfacce sono astratte per impostazione predefinita, quindi la parola chiave è ridondante. Sapendo questo, non lo userei mai per "evitare il disordine della presentazione".


Questa dovrebbe essere la risposta giusta. Ecco un link aggiornato - vedi la sezione "note"
mork

JLS non afferma che la parola chiave sia obsoleta per i metodi nelle interfacce. Dice "È consentito, ma scoraggiato come una questione di stile, specificare in modo ridondante il modificatore pubblico e / o astratto per un metodo dichiarato in un'interfaccia". JLS # 9.4 .
Marchese di Lorne,

@EJP Non ho detto che il JLS ha dichiarato che la parola chiave sarebbe obsoleta, questa era la mia opinione personale;) A proposito, notano che questa parola chiave è "ridondante" che non è esattamente la stessa di obsoleta, in questo hai ragione ovviamente . Ora che so modificherò la risposta per chiarire questo.
Daniel Hiller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.