W Javie interfejsy są niezbędne, jeśli chodzi o ustalanie kontraktów klas i gwarantowanie spójności kodu w obszarze programowania w Javie. Służy jako plan klasy, opisując szereg metod, które klasa implementująca musi zaimplementować. Abstrakcja, modułowość i łatwość konserwacji kodu mogą zostać osiągnięte przez programistów poprzez zastosowanie interfejsów. The różne typy interfejsów w Javie zostaną omówione w tej sekcji.
Interfejsy znaczników
Interfejsy znaczników, często nazywane interfejsami znaczników, to interfejsy bez zadeklarowanych żadnych metod. Mówiąc najprościej, służą jako znaczniki, sygnalizując, że klasa implementująca interfejs znacznika ma określone właściwości lub cechy. Środowisko wykonawcze Java i inne narzędzia korzystają z tych interfejsów API w celu zapewnienia dodatkowej funkcjonalności lub danych. Serializable, Cloneable i Remote to niektóre przykłady interfejsów znaczników w Javie.
Interfejsy funkcjonalne
W ramach ulepszeń wyrażeń lambda i programowania funkcjonalnego do Java 8 dodano interfejsy funkcjonalne. Interfejs, który ma dokładnie jedną abstrakcyjną metodę, jest uważany za funkcjonalny. Dodatkowo możliwe są metody domyślne i statyczne. Wiele funkcji programowania funkcjonalnego w języku Java, takich jak wyrażenia lambda i odwołania do metod, wykorzystuje interfejsy funkcjonalne. Predykat, Konsument, Funkcja i Dostawca to tylko niektóre z wbudowanych interfejsów funkcjonalnych oferowanych przez pakiet java.util.function.
Interfejsy pojedynczej metody abstrakcyjnej (SAM).
Przed wersją Java 8 istniały pewne rodzaje interfejsów funkcjonalnych zwanych interfejsami SAM. Interfejsy te mogą mieć dowolną liczbę metod domyślnych lub statycznych, ale tylko jedną metodę abstrakcyjną. Runnable, Comparator i MouseListener to kilka interfejsów API starszych niż Java 8, które zawierają przykłady interfejsów SAM. Wraz z wprowadzeniem interfejsów funkcjonalnych w Javie 8, interfejsów SAM można używać z wyrażeniami lambda i uważać je za interfejsy funkcjonalne.
wyliczenie tostring Java
Normalne interfejsy
Najbardziej rozpowszechnionym rodzajem interfejsów w Javie są interfejsy normalne. Mają jedną lub więcej abstrakcyjnych metod, które muszą zaimplementować klasy implementujące interfejs. Począwszy od wersji Java 8, normalne interfejsy mogą dodatkowo zawierać metody domyślne i statyczne. Zwykłe interfejsy są używane przez programistów do określania reguł lub wymagań, których muszą przestrzegać klasy. List, Set i Map, wszystkie znajdujące się w pakiecie java.util, są przykładami typowych interfejsów Java.
Wiele interfejsów dziedziczenia
Java pozwala klasom na implementację wielu interfejsów, ale nie obsługuje dziedziczenia wielokrotnego klas. Interfejsy implementowane przez klasę w celu jednoczesnego definiowania wielu kontraktów lub dziedziczenia zachowań nazywane są interfejsami wielokrotnego dziedziczenia. Klasa może oferować funkcjonalność określoną przez każdy interfejs poprzez implementację kilku interfejsów. Za pomocą tej funkcjonalności programiści mogą ponownie wykorzystywać kod i zwiększać możliwości adaptacji swoich pomysłów.
Oto przykłady kodu dla każdego typu interfejsu w Javie wraz z odpowiadającymi im danymi wyjściowymi:
Interfejsy znaczników
MarkerInterfaceExample.java
import java.io.Serializable; // Marker Interface interface MyMarkerInterface extends Serializable { } public class MarkerInterfaceExample { public static void main(String[] args) { MyMarkerInterface obj = new MyMarkerInterface() { }; System.out.println(obj instanceof Serializable); // true } }
Wyjście:
walnij Elif
true
Interfejsy funkcjonalne
FunctionalInterfaceExample.java
import java.util.function.Predicate; public class FunctionalInterfaceExample { public static void main(String[] args) { Predicate isLengthGreaterThan5 = str -> str.length() > 5; System.out.println(isLengthGreaterThan5.test('Hello')); // false System.out.println(isLengthGreaterThan5.test('OpenAI')); // true } }
Wyjście:
false true
Interfejsy pojedynczej metody abstrakcyjnej (SAM):
SAMTerfaceExample.java
interface MySAMInterface { void performAction(); } public class SAMInterfaceExample { public static void main(String[] args) { MySAMInterface obj = () -> System.out.println('Performing action'); obj.performAction(); // Performing action } }
Wyjście:
PowerShell większy lub równy
Performing action
Normalne interfejsy
NormalnyInterfejsPrzykład.java
import java.util.List; import java.util.ArrayList; interface MyInterface { void printMessage(); } class MyClass implements MyInterface { @Override public void printMessage() { System.out.println('Hello, World!'); } } public class NormalInterfaceExample { public static void main(String[] args) { MyInterface obj = new MyClass(); obj.printMessage(); // Hello, World! } }
Wyjście:
math.pow Java
Hello, World!
Interfejsy wielokrotnego dziedziczenia:
MultipleInheritanceInterfaceExample.java
interface Interface1 { void method1(); } interface Interface2 { void method2(); } class MyClass implements Interface1, Interface2 { @Override public void method1() { System.out.println('Method 1'); } @Override public void method2() { System.out.println('Method 2'); } } public class MultipleInheritanceInterfaceExample { public static void main(String[] args) { MyClass obj = new MyClass(); obj.method1(); // Method 1 obj.method2(); // Method 2 } }
Wyjście:
Method 1 Method 2
Te przykłady demonstrują użycie i zachowanie różnych typów interfejsów w Javie. Możesz uruchomić każdy fragment kodu indywidualnie, aby obserwować odpowiednie dane wyjściowe.
Podsumowując, interfejsy Java oferują skuteczną metodę określania kontraktów i uzyskiwania modułowości kodu. Interfejsy są niezbędne w rozwoju języka Java, niezależnie od tego, czy są to interfejsy znaczników wskazujące określone cechy, interfejsy funkcjonalne umożliwiające programowanie funkcjonalne, zwykłe interfejsy definiujące kontrakty, czy też interfejsy wielokrotnego dziedziczenia, które łączą kilka kontraktów. Programiści Java są lepiej przygotowani do tworzenia przejrzystego, rozszerzalnego kodu, gdy znają różne typy interfejsów i ich funkcje.