Java: Statik Sınıf?


130

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?


14
Üst düzey bir sınıfı statik yapamazsınız bu arada ...
Jon

Yanıtlar:


163

Son olarak işaretlenmiş bir sınıf üzerinde özel oluşturucu ve statik yöntemler.


19
@matt b: David Robles'in cevabında belirttiği gibi, sınıfı final yapmanıza gerek yoktur ... alt sınıflara alınamaz çünkü bir alt sınıf özel olduğu için bir süper sınıf kurucusunu çağıramaz. Ancak ... açık olmaktan zarar gelmez. Ama jfyi :-).
Tom

93

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.


1
Neden seçtin AssertionErrorgibi diğer alternatifleri üzerinde IllegalStateException, UnsupportedOperationExceptionvb?
Pacerier

Bkz @Pacerier bu .
bcsb1001

@ bcsb1001, Bu bizi getirdiği bu .
Pacerier


6

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


17
Singletonlar da kötü olarak kabul edilir.
Dan Dyer

3
Herhangi birinin sınıfın örneğini oluşturmasını veya alt sınıflara girmesini önlemek için özel oluşturucuyu kullanırsınız. David Robles'in cevabını görün: stackoverflow.com/questions/1844355/java-static-class/…
rob

5
singleton, bağımlılık enjeksiyonundan daha kötü değil :)
çevrilemez

12
OO'nun yeri vardır, ancak pratik olmadığı veya kaynak israfı olacağı zamanlar vardır - örneğin, Math.abs () kadar basit bir şey. Statik bir yöntem çağrısı, herhangi bir OO-ek yükü olmadan size iyi hizmet etmişse, bir nesneyi yalnızca bir nesneyi örneklemek uğruna örneklemek için hiçbir neden yoktur. ;)
soymak

2
@rob re OO, katılıyorum, Math.Abs ​​muhtemelen bir örneğe ihtiyaç duymaz. "Bir yardımcı program sınıfım var" ifadesini duyduğumda, şimdi ağırlıklı ortalama için desteklenen eklemeniz gereken Math.Avg () 'yi görüyorum. Href veya yalnızca url'yi desteklemek için yeniden düzenlenmesi gereken bir URL üreteci, param girişi, url çıkışı görüyorum. Bu nedenlerden dolayı, OO tabanlı hizmet sınıfına sahip olmak geri ödeme yapabilir. Ayrıca, şimdi standart OO savunma taktiğini bırakıp test edeceğim! / me ducks
Bennett Dill

3

"ö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.


7
Object.staticMethod'u görmüş (üretim kodunda, jsut öğrenci kodunu değil) biri Joe Random Programmer'ın yeteneklerini abarttığını düşünüyorum! :-P
TofuBeer

2
  • Son sınıf ve özel kurucu (iyi ama gerekli değil)
  • Genel statik yöntemler

1

Sınıfı olarak ilan etmenin bir anlamı yok static. Sadece yöntemlerini bildirin staticve 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.)


1
Ayrıca, özel bir kurucu yapmayı da unutmayın.
Asaph

@Asaph: Kabul edildi. Cevabıma biraz ekledim. Teşekkürler.
Bill the Lizard

Bir iç sınıf içinde statik yöntemler istiyorsanız, sınıfın da statik olması gerekir.
Rui Marques

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.