Yararlı fonksiyonlarla dolu bir sınıfım var. Bir örneğini örneklemek anlamsal bir anlam ifade etmiyor, ancak yine de yöntemlerini çağırmak istiyorum. Bununla başa çıkmanın en iyi yolu nedir? Statik sınıf? Öz?
Yararlı fonksiyonlarla dolu bir sınıfım var. Bir örneğini örneklemek anlamsal bir anlam ifade etmiyor, ancak yine de yöntemlerini çağırmak istiyorum. Bununla başa çıkmanın en iyi yolu nedir? Statik sınıf? Öz?
Yanıtlar:
Son olarak işaretlenmiş bir sınıf üzerinde özel oluşturucu ve statik yöntemler.
Harika "Etkili Java" kitabına göre :
Madde 4: Özel bir kurucu ile istikrarsızlığı zorla
- Bir sınıf soyutu yaparak kararsızlık sağlamaya çalışmak işe yaramaz.
- Varsayılan bir kurucu, yalnızca bir sınıf açık oluşturucu içermiyorsa oluşturulur, bu nedenle bir sınıf, özel bir oluşturucu dahil edilerek başlatılamaz hale getirilebilir:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Açık kurucu özel olduğundan, sınıfın dışında buna erişilemez. AssertionError kesinlikle gerekli değildir, ancak kurucunun yanlışlıkla sınıf içinden çağrılması durumunda sigorta sağlar. Sınıfın hiçbir koşulda asla somutlaştırılmayacağını garanti eder. Yapıcı, çağrılamayacak şekilde açıkça sağlandığından, bu deyim biraz mantıksızdır. Bu nedenle, yukarıda gösterildiği gibi bir yorum eklemek akıllıca olacaktır.
Bir yan etki olarak, bu deyim aynı zamanda sınıfın alt sınıflara alınmasını da engeller. Tüm yapıcılar, açıkça veya örtük olarak bir üst sınıf kurucusunu çağırmalıdır ve bir alt sınıfın çağrılacak erişilebilir bir üst sınıf kurucusu yoktur.
AssertionError
gibi diğer alternatifleri üzerinde IllegalStateException
, UnsupportedOperationException
vb?
Görünüşe göre java.lang.Math'e benzer bir yardımcı program sınıfınız var .
Buradaki yaklaşım, özel kurucu ve statik yöntemlerle son sınıftır.
Ancak bunun test edilebilirlik için ne yaptığına dikkat edin, bu makaleyi okumanızı tavsiye ederim
Statik Yöntemler Test Edilebilirlik Ölümüdür
Sadece yukarı yüzmek için, statik üyeler ve sınıflar OO'ya katılmaz ve bu nedenle kötüdür. Hayır, kötü değil, ama cidden, erişim için tek tonlu normal bir sınıf tavsiye ederim. Bu şekilde, yolun ilerisindeki herhangi bir durumda davranışı geçersiz kılmanız gerekirse, bu büyük bir yeniden teçhizat değildir. OO senin arkadaşın :-)
0,02 dolarım
"özel kurucu" argümanları hakkında yorum yapın: hadi, geliştiriciler o kadar da aptal değil; ama tembeller. bir nesne oluşturup sonra statik yöntemleri çağırır mısınız? olmayacak.
Sınıfınızın kötüye kullanılmayacağından emin olmak için çok fazla zaman harcamayın. meslektaşlarınıza biraz inançlı olun. ve onu nasıl koruyor olursanız olun, sınıfınızı kötüye kullanmanın her zaman bir yolu vardır. Suistimal edilemeyen tek şey, tamamen yararsız olan şeydir.
Sınıfı olarak ilan etmenin bir anlamı yok static
. Sadece yöntemlerini bildirin static
ve onları Java'nın Math sınıfı gibi normal olarak sınıf adından çağırın .
Ayrıca, kurucuyu özel yapmak kesinlikle gerekli olmasa da, bunu yapmak iyi bir fikirdir. Yapıcıyı özel olarak işaretlemek, diğer kişilerin sınıfınızın örneklerini oluşturmasını ve ardından bu örneklerden statik yöntemleri çağırmasını engeller. (Bu çağrılar Java'da tamamen aynı şekilde çalışır, yalnızca yanıltıcıdır ve kodunuzun okunabilirliğine zarar verir.)
Lombok https://projectlombok.org/features/experimental/UtilityClass adresinden @UtilityClass ek açıklamasını kullanabilirsiniz.