Saya tidak pernah menemukan jawaban yang bagus untuk pertanyaan sederhana tentang kelas helper / utility ini:
Mengapa saya membuat singleton (stateless) daripada menggunakan metode statis?
Mengapa sebuah instance objek diperlukan jika sebuah objek tidak memiliki status?
java
design-patterns
singleton
Sebastien Lorber
sumber
sumber
Jawaban:
Seringkali, lajang digunakan untuk memperkenalkan beberapa jenis status global ke suatu aplikasi. (Lebih sering daripada yang sebenarnya diperlukan, jujur saja, tapi itu topik untuk lain waktu.)
Namun, ada beberapa kasus sudut di mana bahkan singleton tanpa kewarganegaraan pun dapat berguna:
Contoh: Objek sinkronisasi untuk C #
lock
atausynchronized
pernyataan Java .Contoh:
Toolkit.getDefaultToolkit()
Metode di Java akan mengembalikan singleton yang tipe pastinya bergantung pada sistem.Contoh:
DBNull.Value
di C #.sumber
Saya bisa melihat kasus untuk singleton tanpa kewarganegaraan yang digunakan sebagai pengganti kelas metode statis, yaitu untuk Injeksi Ketergantungan .
Jika Anda memiliki kelas pembantu dari fungsi utilitas yang Anda gunakan secara langsung, ini akan membuat ketergantungan tersembunyi; Anda tidak memiliki kendali atas siapa yang dapat menggunakannya, atau di mana. Memasukkan kelas helper yang sama melalui instans tunggal tanpa negara memungkinkan Anda mengontrol di mana dan bagaimana kelas itu digunakan, dan menggantinya / mengejeknya / dll. Bila perlu.
Menjadikannya instance tunggal hanya memastikan bahwa Anda tidak mengalokasikan objek jenis lebih dari yang diperlukan (karena Anda hanya membutuhkan satu objek).
sumber
Sebenarnya saya telah menemukan jawaban lain yang tidak disebutkan di sini: metode statis lebih sulit untuk diuji.
Tampaknya sebagian besar framework pengujian berfungsi dengan baik untuk mengejek metode instance, tetapi banyak di antaranya tidak menangani metode statis tiruan dengan cara yang layak.
sumber
Dalam kebanyakan bahasa pemrograman, kelas menghindari banyak tipe sistem. Meskipun kelas, dengan metode dan variabel statisnya adalah objek, sering kali ia tidak dapat mengimplementasikan antarmuka atau memperluas kelas lain. Oleh karena itu, ini tidak dapat digunakan secara polimorfik, karena tidak dapat menjadi subtipe dari tipe lain. Misalnya, jika Anda memiliki antarmuka
IFooable
, yang diperlukan oleh beberapa metode tanda tangan dari kelas-kelas lain, objek kelasStaticFoo
tidak dapat digunakan di tempatIFooable
, sedangkanFooSingleton.getInstance()
kaleng (dengan asumsi,FooSingleton
alatIFooable
).Harap dicatat, bahwa, saat saya mengomentari jawaban Heinzi, singleton adalah pola untuk mengontrol instansiasi. Ini menggantikan
new Class()
denganClass.getInstance()
, yang memberi penulisClass
kontrol lebih besar atas instance, yang dapat dia gunakan untuk mencegah pembuatan instance yang tidak perlu. Singleton hanyalah kasus yang sangat khusus dari pola pabrik dan harus diperlakukan seperti itu. Penggunaan umum membuatnya menjadi kasus khusus dari pendaftar global, yang seringkali berakhir buruk, karena pendaftar global tidak boleh digunakan sembarangan.Jika Anda berencana untuk menyediakan fungsi helper global, metode statis akan berfungsi dengan baik. Kelas tidak akan bertindak sebagai kelas, melainkan hanya sebagai namespace. Saya sarankan, Anda mempertahankan kohesi tinggi, atau Anda mungkin berakhir dengan masalah kopling yang paling aneh.
greetz
back2dos
sumber
Ada trade-off antara menggunakan yang mana. Lajang mungkin atau mungkin tidak memiliki status dan mereka mengacu pada objek. Jika mereka tidak menyimpan status dan hanya digunakan untuk akses global, maka statis lebih baik karena metode ini akan lebih cepat. Tetapi jika Anda ingin menggunakan objek dan konsep OOP (Inheritance polymorphism), maka singleton lebih baik.
Perhatikan contoh: java.lang.Runtime adalah kelas tunggal di java. Kelas ini memungkinkan implementasi yang berbeda untuk setiap JVM. Implementasinya tunggal per JVM. Jika kelas ini statis, kami tidak dapat meneruskan implementasi yang berbeda berdasarkan JVM.
Saya menemukan tautan ini sangat membantu: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
Semoga membantu !!
sumber
Bagi saya "Ingin Status Objek menggunakan Singleton, Ingin Fungsi menggunakan metode statis"
Itu tergantung pada apa yang Anda inginkan. Kapan pun Anda menginginkan status objek (misalnya, Polimorfisme seperti status Null
null
, atau status default), singleton adalah pilihan yang tepat untuk Anda sedangkan metode statis digunakan saat Anda membutuhkan fungsi (Terima input lalu kembalikan output).Saya merekomendasikan untuk kasus tunggal, itu harus selalu dalam keadaan yang sama setelah dipakai. Seharusnya tidak dapat di-clonable, atau menerima nilai apa pun untuk disetel (kecuali konfigurasi statis dari file misalnya file properti di java).
PS Kinerja antara 2 ini berbeda dalam milidetik, jadi fokuslah pada Arsitektur terlebih dahulu.
sumber
Singleton bukan tanpa kewarganegaraan, ia memegang status global.
Beberapa alasan yang dapat saya pikirkan untuk menggunakan Singleton adalah:
sumber