Selama beberapa bulan terakhir, saya tersandung beberapa kali selama teknik / pola berikut. Namun, sepertinya saya tidak dapat menemukan nama tertentu, saya juga tidak 100% yakin tentang semua kelebihan dan kekurangannya.
Polanya berbunyi sebagai berikut:
Dalam antarmuka Java, seperangkat metode umum didefinisikan seperti biasa. Namun, menggunakan kelas dalam, instance default bocor melalui antarmuka.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
Bagi saya, tampaknya keuntungan terbesar terletak pada kenyataan bahwa seorang pengembang hanya perlu tahu tentang antarmuka dan bukan implementasinya, misalnya jika dia ingin segera membuat contoh.
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
Selain itu, saya telah melihat teknik ini digunakan bersama-sama dengan Spring untuk secara dinamis memberikan contoh tergantung pada konfigurasi. Dalam hal ini, sepertinya ini juga dapat membantu dengan modularisasi.
Namun demikian, saya tidak dapat menghilangkan perasaan bahwa ini adalah penyalahgunaan antarmuka karena menggabungkan antarmuka dengan salah satu implementasinya. (Prinsip inversi ketergantungan dll.) Adakah yang bisa menjelaskan kepada saya bagaimana teknik ini disebut, serta kelebihan & kekurangannya?
Memperbarui:
Setelah beberapa waktu untuk dipertimbangkan, saya memeriksa kembali dan memperhatikan bahwa versi pola singleton berikut ini digunakan jauh lebih sering. Dalam versi ini, instance statis publik diekspos melalui antarmuka yang diinisialisasi hanya sekali (karena bidangnya final). Selain itu, instance hampir selalu diambil menggunakan Spring atau pabrik generik yang memisahkan antarmuka dari implementasi.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
Singkatnya: tampaknya ini adalah pola pabrik tunggal / custom, yang pada dasarnya memungkinkan untuk mengekspos instance atau singleton melalui antarmuka-nya. Sehubungan dengan kerugian, beberapa telah disebutkan dalam jawaban & komentar di bawah ini. Sejauh ini, keuntungan tampaknya terletak pada kenyamanannya.
Vehicle.Default
harus dipindahkan ke namespace paket sebagai kelas pabrik, mis VehicleFactory
.
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()