English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

教程基础Java

Controllo di flusso Java

Array di Java

Orientamento ad oggetti in Java (I)

Orientamento ad oggetti in Java (II)

Orientamento ad oggetti in Java (III)

Gestione delle eccezioni Java

List di Java

Queue (coda) di Java

Map collection di Java

Set collection di Java

Input/Output (I/O) di Java

Reader/Writer di Java

Altri argomenti di Java

Metodi di interfaccia privati in Java 9

Nuove funzionalità Java 9

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

Nuove funzionalità Java 9