Java 8 Default Methods: Interfaces verbeteren & backward compatibility
Java 8 introduceert het concept van default-methode-implementatie in interfaces. Deze mogelijkheid is toegevoegd voor backward compatibility, zodat oude interfaces de lambda-expressie-mogelijkheden van Java 8 kunnen benutten.
Bijvoorbeeld, de List- of Collection-interfaces hebben geen forEach-methode-declaratie. Het toevoegen van zo'n methode zou de collection framework-implementaties breken. Java 8 introduceert default-methodes zodat List/Collection een standaardimplementatie van forEach kan hebben, en implementerende klassen hoeven deze niet te implementeren.
Syntaxis
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
Meerdere Defaults
Met default-functies in interfaces kan een klasse twee interfaces implementeren met dezelfde default-methode. De volgende code toont hoe deze ambiguïteit opgelost kan worden.
public interface vehicle {
default void print() { System.out.println("I am a vehicle!"); }
}
public interface fourWheeler {
default void print() { System.out.println("I am a four wheeler!"); }
}
Oplossing 1: Maak een eigen methode die de default-implementatie overschrijft.
public class car implements vehicle, fourWheeler {
public void print() { System.out.println("I am a four wheeler car vehicle!"); }
}
Oplossing 2: Roep de default-methode van de gespecificeerde interface aan via super.
public class car implements vehicle, fourWheeler {
public void print() { vehicle.super.print(); }
}
Statische Default-methodes
Een interface kan vanaf Java 8 ook statische hulpmethodes hebben.
public interface vehicle {
default void print() { System.out.println("I am a vehicle!"); }
static void blowHorn() { System.out.println("Blowing horn!!!"); }
}
Default-methode Voorbeeld
Maak het volgende programma in C:\JAVA:
Java8Tester.java
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
static void blowHorn() { System.out.println("Blowing horn!!!"); }
}
interface FourWheeler {
default void print() { System.out.println("I am a four wheeler!"); }
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}
Resultaat verifiëren
Compileer met javac:
C:\JAVA> javac Java8Tester.java
Voer uit:
C:\JAVA> java Java8Tester
Uitvoer:
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
Java
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
- Java Strings beheersen: aanmaken, methodes en best practices
- Java abstracte klassen en methoden: een uitgebreide gids
- Java interfaces meesteren: concepten, implementatie en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
- Java String toLowerCase() & toUpperCase(): Tekstcase Converteren met Locale Awareness