Menguasai Antarmuka Java: Konsep, Implementasi, dan Praktik Terbaik
Antarmuka Java Dijelaskan
Antarmuka Java mendefinisikan kontrak yang harus dipatuhi oleh kelas yang mengimplementasikannya. Mereka memungkinkan abstraksi, pewarisan ganda, dan mempromosikan arsitektur yang bersih dan modular.
Mendefinisikan Antarmuka
Sebuah antarmuka adalah tipe yang sepenuhnya abstrak. Semua metodenya secara implisit public abstract, dan semua field-nya public static final. Ia dideklarasikan dengan kata kunci interface:
interface Language { void getType(); void getVersion(); }
Di sini, Language adalah antarmuka yang berisi dua metode abstrak.
Mengimplementasikan Antarmuka
Antarmuka tidak dapat diinstantiasi. Kelas mengimplementasikannya menggunakan kata kunci implements dan menyediakan badan konkret untuk semua metode abstrak.
Contoh 1: Antarmuka Polygon
interface Polygon { void getArea(int length, int breadth); } class Rectangle implements Polygon { @Override public void getArea(int length, int breadth) { System.out.println("Luas persegi panjang adalah " + (length * breadth)); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(5, 6); } }
Output:
Luas persegi panjang adalah 30
Contoh 2: Antarmuka Language
interface Language { void getName(String name); } class ProgrammingLanguage implements Language { @Override public void getName(String name) { System.out.println("Bahasa Pemrograman: " + name); } } class Main { public static void main(String[] args) { ProgrammingLanguage lang = new ProgrammingLanguage(); lang.getName("Java"); } }
Output:
Bahasa Pemrograman: Java
Mengimplementasikan Beberapa Antarmuka
Sebuah kelas dapat mengimplementasikan beberapa antarmuka:
interface A { /* members */ } interface B { /* members */ } class C implements A, B { /* implementations */ }
Memperluas Antarmuka
Antarmuka dapat memperluas antarmuka lain menggunakan extends:
interface Line { /* members */ } interface Polygon extends Line { /* members */ }
Sebuah kelas yang mengimplementasikan Polygon harus menyediakan metode untuk anggota Line dan Polygon.
Memperluas Beberapa Antarmuka
interface A { /* ... */ } interface B { /* ... */ } interface C extends A, B { /* ... */ }
Mengapa Menggunakan Antarmuka?
- Abstraksi: Mendefinisikan operasi tanpa menentukan implementasi, memungkinkan perilaku yang bervariasi di seluruh kelas.
- Spesifikasi: Menetapkan kontrak jelas yang harus dipenuhi oleh kelas yang mengimplementasikan.
- Pewarisan Ganda: Memungkinkan kelas untuk mengadopsi perilaku dari banyak sumber.
- Default Visibility: Semua metode secara implisit
public; field adalah public static final.
Contoh konstanta implisit:
interface Language { String TYPE = "bahasa pemrograman"; // implicitly public static final void getName(); // implicitly public }
Metode Default (Java 8+)
Java 8 memperkenalkan metode default, yang memungkinkan antarmuka untuk berisi badan metode konkret:
default void getSides() { System.out.println("Saya bisa mendapatkan sisi poligon."); }
Metode default memungkinkan kompatibilitas mundur saat menambahkan metode baru ke antarmuka tanpa merusak implementasi yang ada.
Contoh: Penggunaan Metode Default
interface Polygon { void getArea(); default void getSides() { System.out.println("Saya bisa mendapatkan sisi poligon."); } } class Rectangle implements Polygon { @Override public void getArea() { int length = 6; int breadth = 5; int area = length * breadth; System.out.println("Luas persegi panjang adalah " + area); } @Override public void getSides() { System.out.println("Saya memiliki 4 sisi."); } } class Square implements Polygon { @Override public void getArea() { int length = 5; int area = length * length; System.out.println("Luas persegi adalah " + area); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(); r.getSides(); Square s = new Square(); s.getArea(); s.getSides(); } }
Output:
Luas persegi panjang adalah 30 Saya memiliki 4 sisi. Luas persegi adalah 25 Saya bisa mendapatkan sisi poligon.
Metode Statis dan Private (Java 9+)
Antarmuka sekarang dapat berisi metode static, yang dapat dipanggil melalui nama antarmuka:
interface Polygon { static void helper() { /* ... */ } } Polygon.helper();
Metode private menyediakan utilitas internal untuk metode antarmuka lain, memastikan enkapsulasi.
Contoh Praktis: Perhitungan Poligon
import java.lang.Math; interface Polygon { void getArea(); default void getPerimeter(int... sides) { int perimeter = 0; for (int side : sides) perimeter += side; System.out.println("Keliling: " + perimeter); } } class Triangle implements Polygon { private final int a, b, c; private double area; Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } @Override public void getArea() { double s = (a + b + c) / 2.0; area = Math.sqrt(s * (s - a) * (s - b) * (s - c)); System.out.println("Luas: " + area); } } class Main { public static void main(String[] args) { Triangle t = new Triangle(2, 3, 4); t.getArea(); t.getPerimeter(2, 3, 4); } }
Output:
Luas: 2.9047375096555625 Keliling: 9
Dalam contoh ini, antarmuka Polygon menyediakan metode getPerimeter yang dapat digunakan kembali, sementara setiap bentuk mengimplementasikan perhitungan luasnya sendiri.