Tidak ada yang salah dengan kelas statis yang benar-benar statis . Artinya, tidak ada keadaan internal untuk dibicarakan yang akan menyebabkan output dari metode berubah.
Jika Dice.roll()
hanya mengembalikan nomor acak baru dari 1 ke 6, itu tidak mengubah keadaan. Memang, Anda mungkin berbagi Random
contoh, tapi saya tidak akan menganggap bahwa perubahan status secara definisi, output akan selalu baik, acak. Ini juga thread-safe sehingga tidak ada masalah di sini.
Anda akan sering melihat "Pembantu" akhir atau kelas utilitas lain yang memiliki konstruktor pribadi dan anggota statis. Konstruktor pribadi tidak mengandung logika dan berfungsi hanya untuk mencegah seseorang membuat instance kelas. Pengubah akhir hanya membawa pulang ide ini bahwa ini bukan kelas yang ingin Anda dapatkan. Ini hanyalah kelas utilitas. Jika dilakukan dengan benar, seharusnya tidak ada anggota tunggal atau anggota kelas lain yang tidak statis dan final.
Selama Anda mengikuti pedoman ini dan Anda tidak membuat lajang, sama sekali tidak ada yang salah dengan ini. Anda menyebutkan kelas controller, dan ini hampir pasti akan memerlukan perubahan keadaan, jadi saya akan menyarankan agar tidak menggunakan metode statis saja. Anda dapat sangat bergantung pada kelas utilitas statis, tetapi Anda tidak dapat membuatnya menjadi kelas utilitas statis.
Apa yang dianggap sebagai perubahan status untuk suatu kelas? Baiklah, mari kita singkirkan angka acak selama sedetik, karena mereka tidak ditentukan oleh definisi dan karenanya nilai pengembalian sering berubah.
Fungsi murni adalah fungsi yang deterministik, artinya, untuk input yang diberikan, Anda akan mendapatkan satu dan tepat satu output. Anda ingin metode statis menjadi fungsi murni. Di Jawa ada cara untuk mengubah perilaku metode statis untuk mempertahankan keadaan, tetapi mereka hampir tidak pernah merupakan ide yang baik. Ketika Anda mendeklarasikan suatu metode sebagai statis , programmer umumnya akan langsung menganggap bahwa itu adalah fungsi murni. Menyimpang dari perilaku yang diharapkan adalah bagaimana Anda cenderung membuat bug di program Anda, secara umum dan harus dihindari.
Singleton adalah kelas yang berisi metode statis tentang kebalikan dari "fungsi murni" yang Anda bisa. Seorang anggota pribadi statis tunggal disimpan secara internal ke kelas yang digunakan untuk memastikan ada satu contoh. Ini bukan praktik terbaik dan dapat membuat Anda kesulitan nanti karena sejumlah alasan. Untuk mengetahui apa yang sedang kita bicarakan, berikut adalah contoh sederhana dari singleton:
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"