Sampeyan bubar nyelidiki pola desain singleton , carane ngleksanakake ing Jawa, lan kanggo apa. Nanging apa yen aku pitutur marang kowe yen Jawa teka karo singleton dhewe metu saka kothak? Penasaran? Banjur ayo nyilem.

Sampeyan mbokmenawa wis ngerti babagan kelas Enum . Nduwe fitur khusus sing kudu dingerteni. Khusus, Enum ngetrapake pola desain singleton. Opsi iki meh padha karo pendekatan singleton sing nglibatake lapangan umum .

Singleton minangka enum:


public enum Device {   
    PRINTER	
} 
    

Singleton minangka variabel umum:


public class Printer {   
    public static final Printer PRINTER = new Printer();   
    private Printer() {
    }
//…
}
    

Pendekatan enum luwih kompak tinimbang pendekatan lapangan umum, amarga kita ora perlu nulis implementasine dhewe . Sing paling penting, enum ora duwe masalah karo serialisasi.

Serialisasi saka enums bisa beda-beda tinimbang kanggo obyek biasa: mung nilai jeneng enum sing serialized. Sajrone deserialization, metode kasebut digunakake kanthi jeneng deserialisasi kanggo entuk conto. Kajaba iku, enum bisa nglindhungi sampeyan saka serangan refleksi .

Sampeyan bakal sinau luwih akeh babagan refleksi ing pawulangan ing modul kapindho, ing ngendi kita bakal njelajah API Refleksi .

Jawa nglarang instantiating enums — watesan panggang ing implementasine saka Constructor kelas newInstance metode, kang asring disebut nalika nggawe obyek liwat bayangan.

Kutipan kode saka Constructor.newInstance . Digunakake kanggo nggawe enum :


if ((clazz.getModifiers() & Modifier.ENUM) != 0)
    throw new IllegalArgumentException("Cannot reflectively create enum objects");
    

Kerugian nggunakake enum kanggo nggawe singleton kalebu:

  • Kurang initialization males, amarga obyek digawe langsung lan initialization ora bisa ditundha.

  • Kelas liyane ora bisa ditambahi. Sing, ing kasus ngendi sampeyan kudu oleh warisan kelas liyane, iku ora bakal bisa kanggo nggunakake enum minangka singleton a. Ing kasus kaya mengkono, kita kudu nguripake kanggo opsi implementasine liyane wis dikenal kanggo kita: cara statis utawa variabel umum.

  • Nalika nggunakake enum minangka singleton, sampeyan mung bisa nggunakake siji lapangan enum .


public enum Device extends Electricity { 
    PRINTER 
}
    

Kode iki bakal menehi kesalahan kompilasi:

Ora ngluwihi klausa sing diidini kanggo enum

Nanging yen kita kudu ngetrapake antarmuka, ora ana masalah, amarga enum bisa ngetrapake antarmuka:


public enum Device implements Electricity { 
    PRINTER 
}
    

Yen sampeyan ora perlu nggunakake warisan, paling apik kanggo ngleksanakake pola singleton liwat enum . Kita ora mung nyaranake iki - Joshua Bloch uga nindakake .

Pendekatan implementasine iki menehi penak, kekompakan, serialisasi metu saka kothak, pangayoman saka serangan refleksi, lan keunikan - kabeh sing dibutuhake dening singleton sing apik!