English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Prima di Java 8, gli interfacce potevano avere variabili costanti e metodi astratti.
Non possiamo fornire implementazioni di metodi negli interfacce. Se dobbiamo fornire una combinazione di metodi astratti e non astratti (metodi con implementazione), dobbiamo utilizzare una classe astratta.
public class Tester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging { @Override public void logInfo(String message) { getConnection(); System.out.println("Messaggio di log: " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Messaggio di log: " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Messaggio di log: " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Messaggio di log: " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Apri connessione database"); } @Override public void closeConnection() { System.out.println("Chiudi connessione database"); } } final class LogMySql implements Logging { @Override public void logInfo(String message) { getConnection(); System.out.println("Messaggio di log: " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Messaggio di log: " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Messaggio di log: " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Messaggio di log: " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Apri connessione database"); } @Override public void closeConnection() { System.out.println("Chiudi connessione database"); } } interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; void logInfo(String message); void logWarn(String message); void logError(String message); void logFatal(String message); void getConnection(); void closeConnection(); }
Il risultato dell'esecuzione degli esempi sopra è il seguente:
Apri connessione database Messaggio di log: INFO Chiudi connessione database Apri connessione database Messaggio di log: WARN Chiudi connessione database Apri connessione database Messaggio di log: ERROR Chiudi connessione database Apri connessione database Messaggio di log: FATAL Chiudi connessione database
Nell'esempio sopra, ogni metodo di log ha la sua propria implementazione.
In Java 8, l'interfaccia ha introdotto alcune nuove funzionalità - metodi di default e metodi statici. Possiamo scrivere implementazioni di metodi negli interfacce di Java SE 8 utilizzando il keyword default per definirli.
In Java 8, un'interfaccia può definire i seguenti tipi di variabili/metodi:
Costante
Metodo astratto
Metodo predefinito
Metodo statico
public class Tester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging { } final class LogMySql implements Logging { } interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; default void logInfo(String message) { getConnection(); System.out.println("Messaggio di log: " + "INFO"); closeConnection(); } default void logWarn(String message) { getConnection(); System.out.println("Messaggio di log: " + "WARN"); closeConnection(); } default void logError(String message) { getConnection(); System.out.println("Messaggio di log: " + "ERROR"); closeConnection(); } default void logFatal(String message) { getConnection(); System.out.println("Messaggio di log: " + "FATAL"); closeConnection(); } static void getConnection() { System.out.println("Apri connessione database"); } static void closeConnection() { System.out.println("Chiudi connessione database"); } }
Il risultato dell'esecuzione degli esempi sopra è il seguente:
Apri connessione database Messaggio di log: INFO Chiudi connessione database Apri connessione database Messaggio di log: WARN Chiudi connessione database Apri connessione database Messaggio di log: ERROR Chiudi connessione database Apri connessione database Messaggio di log: FATAL Chiudi connessione database
Java 9 non solo supporta i metodi di default degli interfacce come Java 8, ma supporta anche i metodi privati.
In Java 9, un'interfaccia può definire i seguenti tipi di variabili/metodi:
Costante
Metodo astratto
Metodo predefinito
Metodo statico
Metodo privato
Metodo statico privato
Di seguito è riportato un esempio che estrae la ridondanza in metodi comuni, risultando notevolmente più conciso:
public class Tester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging { } final class LogMySql implements Logging { } interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; private void log(String message, String prefix) { getConnection(); System.out.println("Log Message : " + prefix); closeConnection(); } default void logInfo(String message) { log(message, "INFO"); } default void logWarn(String message) { log(message, "WARN"); } default void logError(String message) { log(message, "ERROR"); } default void logFatal(String message) { log(message, "FATAL"); } private static void getConnection() { System.out.println("Apri connessione database"); } private static void closeConnection() { System.out.println("Chiudi connessione database"); } }
Il risultato dell'esecuzione degli esempi sopra è il seguente:
Apri connessione database Messaggio di log: INFO Chiudi connessione database Apri connessione database Messaggio di log: WARN Chiudi connessione database Apri connessione database Messaggio di log: ERROR Chiudi connessione database Apri connessione database Messaggio di log: FATAL Chiudi connessione database