Gerçekten statik olan statik sınıflarda yanlış bir şey yoktur . Yani, yöntemlerin çıktısının değişmesine neden olacak içsel bir durum söz konusu değildir.
Eğer Dice.roll()
sadece 1 ila 6 arasında yeni bir rastgele sayı dönüyor, bu durumu değiştirmiyor. Verilen bir Random
örneği paylaşıyor olabilirsiniz , ancak tanım gereği bir durum değişikliğinin, çıktının her zaman iyi, rastgele olacağını düşünmüyorum. Ayrıca diş açmaya karşı güvenlidir, bu nedenle burada sorun yoktur.
Sıklıkla özel bir kurucu ve statik üyeleri olan son "Yardımcı" veya diğer yardımcı program sınıflarını görürsünüz. Özel kurucu mantık içermez ve yalnızca birisinin sınıfı örneklemesini önlemeye yarar. Son değiştirici, sadece bunun türetmek isteyeceğiniz bir sınıf olmadığı fikrini getirir. Sadece bir yardımcı sınıftır. Düzgün yapılırsa, kendileri statik ve nihai olmayan singleton veya diğer sınıf üyeleri olmamalıdır.
Bu yönergelere uyduğunuz ve singleton yapmadığınız sürece, bununla ilgili kesinlikle yanlış bir şey yoktur. Bir denetleyici sınıfından bahsediyorsunuz ve bu neredeyse kesinlikle durum değişiklikleri gerektirecek, bu yüzden sadece statik yöntemleri kullanmamanızı tavsiye ederim. Statik bir yardımcı program sınıfına çok güvenebilirsiniz, ancak bunu statik bir yardımcı program sınıfı yapamazsınız .
Bir sınıf için durum değişikliği nedir ? Tanım olarak belirsiz olmayan ve bu nedenle dönüş değeri sık sık değiştiğinden, rastgele sayıları bir saniyeliğine hariç tutalım.
Saf bir işlev deterministik olan bir işlevdir, yani belirli bir girdi için bir ve tam olarak bir çıktı alırsınız. Statik yöntemlerin saf işlevler olmasını istiyorsunuz. Java'da durumu korumak için statik yöntemlerin davranışını değiştirmenin yolları vardır, ancak neredeyse hiç iyi fikir değildir. Bir yöntemi statik olarak bildirdiğinizde , tipik programcı yarasanın hemen dışında saf bir işlev olduğunu varsayar. Beklenen davranışlardan sapmak, genel olarak konuşursak ve programınızda hatalar yaratma eğiliminizdir.
Singleton, olabildiğince "saf işlev" in tersi gibi statik yöntemler içeren bir sınıftır. Tek bir statik özel üye, tam olarak bir örnek olmasını sağlamak için kullanılan sınıfa dahili olarak tutulur. Bu en iyi uygulama değildir ve daha sonra birkaç nedenden dolayı başınızı belaya sokabilir. Ne hakkında konuştuğumuzu bilmek için, işte basit bir singleton örneği:
// 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"