Classe astratta contro interfaccia nell'era JDK 8

Nella nuova API di data e ora di Java 8: un'intervista con Stephen Colebourne, Stephen Colebourne dice a Hartmut Schlosser: "Penso che il cambiamento di lingua più importante non siano i lambda, ma metodi statici e predefiniti sulle interfacce". Colebourne aggiunge: "L'aggiunta di metodi predefiniti rimuove molte delle ragioni per utilizzare classi astratte". Mentre leggevo questo, mi sono reso conto che Colebourne ha ragione e che molte situazioni in cui attualmente utilizzo classi astratte potrebbero essere sostituite con interfacce con metodi predefiniti JDK 8. Questo è piuttosto significativo nel mondo Java in quanto la differenza tra classi astratte e interfacce è stata uno dei problemi che tormentano i nuovi sviluppatori Java che cercano di capire la differenza. In molti modi, differenziare tra i due è ancora più difficile in JDK 8.

Esistono numerosi esempi di forum e blog online che discutono le differenze tra interfacce e classi astratte in Java. Questi includono, ma non sono limitati a, classi astratte di JavaWorld e interfacce, StackOverflow di Quando devo usare le interfacce invece di classi astratte ?, Differenza tra interfaccia e classe astratta e 10 risposte alle domande di intervista e classe astratta in Java. Per quanto utili e informativi come questi erano una volta, molti di loro sono ora obsoleti e potrebbero essere parte di ancora più confusione per coloro che non conoscono Java e iniziano la loro esperienza Java con JDK 8.

Mentre stavo pensando alle restanti differenze tra le interfacce Java e le classi astratte in un mondo JDK 8, ho deciso di vedere cosa aveva da dire il Tutorial Java su questo. Il tutorial è stato aggiornato per riflettere JDK 8 e i metodi e le classi astratti hanno una sezione chiamata "Classi astratte rispetto alle interfacce" che è stata aggiornata per incorporare JDK 8. Questa sezione evidenzia le somiglianze e le differenze delle interfacce JDK 8 con le classi astratte . Le differenze che evidenzia sono l'accessibilità dei membri dei dati e dei metodi: le classi astratte consentono campi non statici e non finali e consentono ai metodi di essere pubblici, privati ​​o protetti mentre i campi delle interfacce sono intrinsecamente pubblici, statici e finali e tutti i metodi di interfaccia sono intrinsecamente pubblici.

Il Tutorial Java prosegue elencando i punti elenco per quando una classe astratta dovrebbe essere considerata e per quando dovrebbe essere considerata un'interfaccia. Non sorprende che derivino dalle differenze menzionate in precedenza e hanno principalmente a che fare con se hai bisogno di campi e metodi per essere privati, protetti, non statici o non finali (preferisci la classe astratta) o se hai bisogno della capacità di concentrarti sulla digitazione indipendentemente dall'implementazione (preferisci l'interfaccia).

Poiché Java consente a una classe di implementare più interfacce ma di estendere solo una classe, l'interfaccia potrebbe essere considerata vantaggiosa quando una particolare implementazione deve essere associata a più tipi. Grazie ai metodi predefiniti di JDK 8, queste interfacce possono persino fornire un comportamento predefinito per le implementazioni.

Una domanda naturale potrebbe essere: "In che modo Java gestisce una classe che implementa due interfacce, che descrivono entrambe un metodo predefinito con la stessa firma?" La risposta è che questo è un errore di compilazione. Ciò è mostrato nell'istantanea della schermata successiva che mostra NetBeans 8 che riporta l'errore quando la mia classe ha implementato due interfacce che definiscono ciascuna un metodo predefinito con la stessa firma ( String speak()).

Come indica l'istantanea della schermata, viene mostrato un errore del compilatore che afferma, "la classe ... eredita i valori predefiniti non correlati per ... dai tipi ... e ..." (dove il nome della classe, il nome del metodo predefinito e due nomi di interfaccia sono tutto ciò che è specificato nel messaggio). Peter Verhas ha scritto un articolo dettagliato ("Metodi predefiniti di Java 8: cosa si può e cosa non si può fare?") Esaminando alcuni casi d'angolo (trucchi) relativi a interfacce implementate in modo multiplo con nomi di metodi predefiniti con la stessa firma.

Conclusione

JDK 8 porta probabilmente il più grande vantaggio della classe astratta rispetto all'interfaccia all'interfaccia. L'implicazione di ciò è che un gran numero di classi astratte usate oggi può essere probabilmente sostituito e un gran numero di lavori futuri che sarebbero stati classi astratte ora saranno invece interfacce con metodi predefiniti.

Questa storia, "Classe astratta contro interfaccia nell'era JDK 8" è stata originariamente pubblicata da marxsoftware.blogspot.com.