Apakah singleton di Jawa?
Singleton ialah salah satu corak reka bentuk peringkat kelas yang paling mudah. Kadangkala orang berkata "kelas ini ialah singleton", yang bermaksud bahawa kelas itu melaksanakan corak reka bentuk tunggal. Kadangkala perlu menulis kelas di mana kita mengehadkan instantiasi kepada objek tunggal. Contohnya, kelas yang bertanggungjawab untuk mengelog atau menyambung ke pangkalan data. Corak reka bentuk singleton menerangkan cara kita boleh mencapai ini. Singleton ialah corak reka bentuk yang melakukan dua perkara:-
Ia menjamin bahawa hanya akan ada satu contoh kelas.
-
Ia menyediakan satu titik akses global kepada contoh itu.
-
Pembina persendirian. Ini mengehadkan keupayaan untuk mencipta objek kelas di luar kelas itu sendiri.
-
Kaedah statik awam yang mengembalikan contoh kelas. Kaedah ini dipanggil getInstance . Ini ialah titik akses global kepada contoh kelas.
Pilihan pelaksanaan
Corak reka bentuk tunggal digunakan dalam pelbagai cara. Setiap pilihan adalah baik dan buruk dengan caranya sendiri. Seperti biasa, tiada pilihan yang sempurna di sini, tetapi kita harus berusaha untuk mendapatkannya. Pertama sekali, mari kita tentukan apa yang membentuk baik dan buruk, dan apakah metrik yang mempengaruhi cara kita menilai pelbagai pelaksanaan corak reka bentuk. Mari kita mulakan dengan kebaikan. Berikut ialah faktor yang menjadikan pelaksanaan lebih juicy dan menarik:-
Inisialisasi malas: contoh tidak dibuat sehingga diperlukan.
-
Kod mudah dan telus: metrik ini, sudah tentu, adalah subjektif, tetapi ia penting.
-
Keselamatan benang: operasi yang betul dalam persekitaran berbilang benang.
-
Prestasi tinggi dalam persekitaran berbilang benang: sedikit atau tiada sekatan benang apabila berkongsi sumber.
-
Tiada permulaan malas: apabila kelas dimuatkan apabila aplikasi bermula, tidak kira sama ada ia diperlukan atau tidak (secara paradoks, dalam dunia IT adalah lebih baik untuk menjadi malas)
-
Kod yang rumit dan sukar dibaca. Metrik ini juga subjektif. Jika mata anda mula berdarah, kami akan menganggap pelaksanaannya bukanlah yang terbaik.
-
Kekurangan keselamatan benang. Dalam erti kata lain, "bahaya benang". Operasi yang salah dalam persekitaran berbilang benang.
-
Prestasi buruk dalam persekitaran berbilang benang: benang menyekat satu sama lain sepanjang masa atau selalunya apabila berkongsi sumber.
Kod
Kini kami bersedia untuk mempertimbangkan pelbagai pilihan pelaksanaan dan menunjukkan kebaikan dan keburukan:Mudah
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
Pelaksanaan paling mudah. Kelebihan:
-
Kod mudah dan telus
-
Keselamatan benang
-
Prestasi tinggi dalam persekitaran berbilang benang
- Tiada permulaan yang malas.
Inisialisasi malas
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Kelebihan:
-
Inisialisasi malas.
-
Tidak selamat benang
Akses disegerakkan
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Kelebihan:
-
Inisialisasi malas.
-
Keselamatan benang
-
Prestasi berbilang benang yang lemah
Penguncian yang disemak dua kali
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
Kelebihan:
-
Inisialisasi malas.
-
Keselamatan benang
-
Prestasi tinggi dalam persekitaran berbilang benang
-
Tidak disokong dalam versi Java yang lebih awal di bawah 1.5 (penggunaan kata kunci yang tidak menentu ditetapkan sejak versi 1.5)
Pemegang kelas
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
Kelebihan:
-
Inisialisasi malas.
-
Keselamatan benang.
-
Prestasi tinggi dalam persekitaran berbilang benang.
-
Operasi yang betul memerlukan jaminan bahawa objek tunggal dimulakan tanpa ralat. Jika tidak, panggilan pertama kepada kaedah getInstance akan menghasilkan ExceptionInInitializerError , dan semua panggilan seterusnya akan menghasilkan NoClassDefFoundError .
Perlaksanaan | Inisialisasi malas | Keselamatan benang | Prestasi berbilang benang | Bila nak guna? |
---|---|---|---|---|
Mudah | - | + | Cepat | tidak pernah. Atau mungkin apabila permulaan malas tidak penting. Tetapi tidak akan menjadi lebih baik. |
Inisialisasi malas | + | - | Tidak berkaitan | Sentiasa apabila multithreading tidak diperlukan |
Akses disegerakkan | + | + | Lambat | tidak pernah. Atau mungkin apabila prestasi berbilang benang tidak penting. Tetapi tidak akan menjadi lebih baik. |
Penguncian yang disemak dua kali | + | + | Cepat | Dalam kes yang jarang berlaku apabila anda perlu mengendalikan pengecualian semasa mencipta singleton (apabila singleton pemegang kelas tidak berkenaan) |
Pemegang kelas | + | + | Cepat | Setiap kali multithreading diperlukan dan ada jaminan bahawa objek tunggal akan dicipta tanpa masalah. |
Kebaikan dan keburukan corak singleton
Secara umum, singleton melakukan apa yang diharapkan daripadanya:-
Ia menjamin bahawa hanya akan ada satu contoh kelas.
-
Ia menyediakan satu titik akses global kepada contoh itu.
-
Singleton melanggar prinsip tanggungjawab tunggal: sebagai tambahan kepada tugas langsungnya, kelas tunggal juga mengawal bilangan kejadian.
-
Kebergantungan kelas biasa pada singleton tidak kelihatan dalam kontrak awam kelas.
-
Pembolehubah global adalah buruk. Akhirnya, singleton bertukar menjadi pembolehubah global yang besar.
-
Kehadiran singleton mengurangkan kebolehujian aplikasi secara keseluruhan dan kelas yang menggunakan singleton khususnya.
GO TO FULL VERSION