Java – Static Factory Methods Nedir?

Bir sınıftan obje yaratmak için kullanılan geleneksel yöntem public bir constructor’ın sağlanmasıdır. Fakat bu yöntemin dışında yazılımcıların bilmesi gereken farklı bir teknik bulunmaktadır. Bir sınıf public static factory metot yazabilirsiniz. Bu metot basit olarak o sınıfın bir örneğini (instance) döner.

Java Static Nedir?

Java programlama dilinde “static” kelimesi, belirli bir nesnenin örneğine bağlı olmayan bir özelliği veya metodu tanımlamak için kullanılır. “static” özellikleri veya metotları kullanarak, sınıfın tüm örnekleri arasında paylaşılan verilere veya işlevlere erişebilirsiniz. Bu, özellikle veri paylaşımı veya tek bir sınıfın birden fazla örneği arasında bilgi iletmek için kullanışlıdır.

Örneğin, bir sınıf içinde bir sayacı sıfırlamak veya sınıfın tüm örnekleri arasında aynı değeri paylaşmak için “static” değişkenler kullanabilirsiniz. Ayrıca, “static” metotlar, sınıf düzeyinde işlemler gerçekleştirmek için kullanılır ve bu metotlar nesne örneğine bağlı olmadan doğrudan sınıf adıyla çağrılabilir.

Aşağıda, “static” bir metot ve değişkenin nasıl tanımlanacağına dair örnek bir Java kodu bulunmaktadır:

public class MyClass {
    private static int instanceCount = 0; // Static bir değişken

    public MyClass() {
        instanceCount++; // Her yeni nesne oluşturulduğunda static değişkeni artırır
    }

    public static int getInstanceCount() {
        return instanceCount; // Static bir metot
    }
}

Yukarıdaki örnekte, “instanceCount” adında bir static değişken sınıfın tüm örnekleri arasında paylaşılır ve “getInstanceCount” adında bir static metot bu değişkene erişim sağlar. Bu sayede, sınıfın kaç örneği oluşturulduğunu takip etmek mümkün hale gelir.

Java’da “static” kullanımı, sınıflar arası işbirliği ve veri paylaşımı için önemli bir araçtır ve doğru bir şekilde kullanıldığında programlarınızın daha düzenli ve verimli olmasına yardımcı olabilir.

Bu yöntem ile ilgili bir örnek Boolean sınıfında var. (boolean’ın wrapper sınıfı)

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

Bir sınıf public bir constructor yerine static factory metot sunabilir. Bu yöntemin bir takım avantajları ve dezavantajları bulunmaktadır.

İsimlendirme Avantajı

Static factory metotun avantajlarından bir tanesi, constructor’lardan farklı olarak bir isimleri vardır. Bir sınıf, aynı parametreler ile yalnızca bir adet constructor’a sahip olabilir. Eğer constructor’ın parametreleri dönen nesneyi anlaşılabilir bir şekilde açıklayamıyorsa, static factory metot’a koyacağımız mantıklı bir isim okunabilirlik açısından developer’a kolaylık sağlayacaktır. Static fabrika metotlar kod okunabilirliğini zenginleştirir.

Maliyet Avantajı

Bu yöntemin bir diğer avantajı, constructorlar gibi her çağrıldıklarında o sınıfın bir örneğini oluşturmak zorunda değillerdir. Durmadan yeni instance ürettiğimizce cacheleme gibi bir mekanizma kurma şansımız yok. Static factory metotlar mevcut nesneleri önbelleğe alabilir ve yeniden kullanabilir. Bu, performansı artırabilir ve gereksiz nesne oluşturma maliyetini azaltabilir. (maliyet+)

Özgür İmplementasyon

Statik factory yöntemi, farklı biçimlerde nesne oluşturmak için çeşitli iç implementasyonları seçme esnekliği sağlar. Public constructorlar ile alt tipte veya farklı tipte nesne üretemiyoruz. Static factory bize bu konuda önemli ölçüde esneklik sunuyor.

API Sürdürülebilirliği

Statik factory metot, client’ın doğrudan sınıf yapısına erişmesini önleyebilir ve daha istikrarlı:( bir API sunabilir. Bu gelecekteki sürümlerde daha fazla esneklik sağlar ve geriye dönük uyumluluğu kolaylaştırır.

Bağımsızlık Avantajı

Statik factory yönteminin bir diğer avantajı, döndürülen nesnenin sınıfının var olması gerekmeyebilmesidir. Bu ne demek derseniz; diyelim bir static factory metotunuz var, ve bu bir nesne dönüyor. Bu nesnenin sınıfı ise henüz yok. Bu sınıf sonradan oluşturulabilir ve değiştirilebilir. Bunu çoğu zaman servis sağlayıcı framework’leri uygular. Java Database Connectivity API (JDBC) bu esnekliği gayet iyi bir şekilde kullanıyor. İlk zamanlarda bu olayı bir türlü oturtamamıştım kafamda. Bir metottan dönen objenin sınıfının olmaması nasıl mümkün olabilir demiştim.Aslıda “nesnenin sınıfının olmaması” ifadesi tam olarak doğru bir ifade değil. Doğru ifade, döndürülen nesnenin sınıfının, statik factory metotunu içeren sınıfın yazıldığı anda var olma zorunluluğunun olmamasıdır.

Daha iyi anlamak için JDBC’den örnek vereyim.

JDBC (Java Database Connectivity), Java programları için veritabanıyla etkileşim kurmak için kullanılan bir API’dir. JDBC’nin servis sağlayıcı framework’ü olarak çalışması için statik fabrika metotlar kullanılır.

Aşağıdaki JDBC kodunu düşünelim:

Connection connection = DriverManager.getConnection(url, username, password);

Burada DriverManager sınıfı, JDBC sürücülerini yönetmek ve bağlantı sağlamak için kullanılır. getConnection statik factory metotu, belirtilen URL, kullanıcı adı ve parola bilgilerine dayanarak bir Connection nesnesi döndürür. Burada dikkat edilmesi gereken nokta, DriverManager.getConnection yöntemi çağrıldığında, hangi JDBC sürücüsünün kullanıldığını belirtmemiz gerekmez. JDBC, çeşitli sürücü sağlayıcılarını destekler ve bu sağlayıcılar sınıflarını DriverManager tarafından kullanılmak üzere kaydeder. Yani JDBC’de client kodu belirli bir veritabanı sağlayıcısıyla değil, genel olarak JDBC API’siyle etkileşimdedir.

Bu avantajı özetleyecek olursak;

İstemci MySQL veritabanına bağlanırken DriverManager.getConnection() yöntemini çağırırken, aynı kod PostgreSQL veritabanına geçtiğinde de aynı şekilde çalışabilir. Statik factory sayesinde farklı veritabanı sağlayıcıları arasında geçiş yaparken veya değişiklik yaparken esneklik sağlanır.

Emre

Software Engineer

More Reading

Post navigation