post-images/private-constructor/cover.jpg

Private Constructor`a Ne Gerek Var?

Merhabalar, bu yazıda Effective Java kitabının ilk ünitesi olan Creating and Destroying Objects'in 4. maddesini ele alacağız.

Kitapta maddenin adı "Enforce noninstantiability with a private constructor" olarak geçsede ben sadece Private Constructor olarak kullanmayı tercih ettim. Sence de garip değil mi? Bir sınıf oluşturuyoruz ve bu sınıfı oluşturabileceğin metodu private ayarlayarak kapsam dışı tutuyorsun. Benim başlığı ilk okuduğumda açıkcası aklıma gelen buydu. Sonrasında okudukça nedenini kavradım. Örneklerle seninle paylaşayım hemen.

Bazı durumlarda ben sadece belli başlı değişkenlerin değerlerini veya static fonksiyonların aksiyonlarını tutmak isteyebilirim. Bu tarz durumlarda tabiki de bu değerlerin başkası tarafından değiştirmemesi benim için önemli oluyor. Aslında temel nedeni tam olarak da bu, hatta şöyle söyleyeyim, hangi seviyede geliştirme yaptığından bağımsız sen daha önce bu yapıyı kullandın.

java.lang.Maths veya java.util.Arrays bu iki sınıf sana tanıdık geliyor mu? Hiç new Maths() veya new Arrays() kullandığını hatırlıyor musun? Hayır değil mi? Sınıfın içine girip incelediğinde sende rahatlıkla private constructor'ı görebilirsin (private Math() {} | private Arrays() {}). Peki bunlar neden böyle? Çünkü tam olarak az önce anlattığım durum burada geçerli. Matematiksel işlemlerde kullanabilmek için örneğin e sayısının ve PI sayısının bir yerde bulunması gerekiyor. Bunlar bahsettiğim ve sabit olmasını istediğim değişkenler tabi bunlara ek floor, log, cos gibi fonksiyonlar da bu class içerisinde tutuluyor. Ufak ama bir o kadar önemli olan bir durumda da bahsetmek isterim. Sizinde görebileceğiniz gibi değişkenlerimiz statik olarak tanımlanmıştır (public static final double PI = 3.14...; | public static final double E = 2.71...;). Kullanmadığınız sürece kod içerisinde private constructor'a sahip sınıfları bulundurmanız gereksiz bellek kullanımına neden olacaktır.

// Noninstantiable utility class
public class UtilityClass {
    // Suppress default constructor for noninstantiability  
    private UtilityClass() {
        throw new AssertionError();
    }
}

throw new AssertionError(); sadece sınıf içerisinde yanlışlıkla çağrılmasına yönelik alınan bir önlemdir. Zaten private ile bu constructor'ın başka bir yerden erişilemeyeceğini garanti etmiş olmuştuk.

JavaEffective JavaCreating and Destroying ObjectsPrivate ConstructorStatic Factory