Oleh : Reza Ervani
بسم الله الرحمن الرحيم
Pertanyaan yang sering muncul adalah apa perbedaan antara interface Java dengan class abstract, dan kapan menggunakan masing-masing hal tersebut.
Interface java digunakan untuk melakukan de-couple interface dari beberapa komponen dari implementasi. Dengan kata lain, untuk membuat class-class yang menggunakan interface menjadi independen dari class-class yang mengimplementasikan interface. Jadi, kita dapat melakukan pertukaran implementasi interface, tanpa harus mengganti class yang menggunakan interface.
Class-class abstract umumnya digunakan sebagai class-class dasar bagi subclass. Beberapa bahasa pemrograman menggunakan class abstract untuk mencapai polimorfisme, dan untuk memisahkan interface dari implementasi, tetapi di Java kita menggunakan interface untuk melakukan hal tersebut. Ingat, suatu class Java hanya dapat memiliki satu superclass, tetapi dia dapat mengimplementasikan banyak interface. Jadi, jika sebuah class sudah memiliki sebuah superclass yang berbeda, dia dapat mengimplementasikan sebuah interface, tetapi tidak dapat melebarkan class abstract yang lain. Sehingga interface memiliki mekanisme yang lebih fleksibel untuk mengekspos sebuah antarmuka yang umum.
Jika kita perlu memisahkan suatu interface dari implementasinya, gunakan sebuah interface. Jika kita juga perlu untuk menyediakan suatu class dasar atau implementasi default dari interface, tambahkan sebuah class abstract (atau class normal) yang mengimplementasikan interface.
Berikut adalah sebuah contoh yang menunjukkan sebuah class yang merujuk ke suatu interface, suatu abstract yang mengimplementasi interface tersebut dan sebuah subclass yang melebarkan class abstract.
Dibawah ini adalah contoh kode dari Class Abstract Java, tetapi dengan sebuah interface yang ditambahkan yang diimplementasikan oleh class dasar abstrak, sebagaimana yang ditunjukan pada diagram diatas.
Pertama interfacenya :
public interface URLProcessor { public void process(URL url) throws IOException; }
Kedua, class dasar abstract :
public abstract class URLProcessorBase implements URLProcessor { public void process(URL url) throws IOException { URLConnection urlConnection = url.openConnection(); InputStream input = urlConnection.getInputStream(); try{ processURLData(input); } finally { input.close(); } } protected abstract void processURLData(InputStream input) throws IOException; }
Ketiga, subclass dari class dasar abstract :
public class URLProcessorImpl extends URLProcessorBase { @Override protected void processURLData(InputStream input) throws IOException { int data = input.read(); while(data != -1){ System.out.println((char) data); data = input.read(); } } }
Keempat, bagaiamana menggunakan interface URLProcessor
sebagai tipe variabel, bahkan meskipun itu adalah subclass UrlProcessorImpl
yang diinstansiasi :
URLProcessor urlProcessor = new URLProcessorImpl(); urlProcessor.process(new URL("http://programming.rezaervani.com"));
Menggunakan kedua interface dan class dasar abstrac membuat kode yang kita buat menjadi lebih fleksibel. Adalah dimungkinkan untuk mengimplementasikan prosesor URL secara sederhana dengan melakukan subclassing class dasar abstract. Jika kita membutuhkan sesuatu yang lebih advance, prosesor URL kita cukup dapat mengimplementasikan interface URLProcessor
secara langsung, dan tidak perlu mewariskan dari URLProcessorBase
.
terima kasih tutorialnya, sangat membantu 😀