Soru Tarihi
Java, nesne yönelimli bir dil olarak geliştirilmeye başladığı için, temel sorunlar sınıf örnekleri oluşturularak çözülüyordu. Ancak sıkça kullanılan metodlar (örneğin, sıralama, veri dönüşümleri) için, statik metodlardan oluşan yardımcı sınıflar (örneğin, java.util.Collections) ortaya çıkmaya başladı.
Problemin Tanımı
Statik metodlar yardımcı fonksiyonların çağrılmasını kolaylaştırır, ancak durum saklamak, bağımlılık enjekti etmek ve izole testler yapmak için uygun değildir. Öte yandan, sınıf örnekleri daha esnektir, ancak başlatma kodunu artırır ve iyi düşünülmüş bir yaşam döngüsü gerektirir.
Çözüm
Yardımcı Sınıflar (utility classes) — durum içermeyen bir dizi statik metod, nesne oluşturmaya gerek yoktur. Koleksiyonlar üzerinde manipülasyon, dönüşümler, matematiksel işlemler için iyidir.
Sınıf Örnekleri — durum saklar, bağımlılıkları kullanır, genişletilebilirlik ve test edilebilirlik sağlar. İş mantığında, servislerde, kontrolörlerde vb. kullanılır.
Kod örneği:
// Yardımcı Sınıf Örneği public class MathUtils { public static int add(int a, int b) { return a + b; } } // Kullanım: int sum = MathUtils.add(1, 2); // İş mantığı için sınıf örneği public class OrderService { private final OrderRepository repo; public OrderService(OrderRepository repo) { this.repo = repo; } public void placeOrder(Order o) { repo.save(o); } }
Ana Özellikler:
Yardımcı Sınıflar miras alınabilir mi ve statik metodları genişletebilir mi?
Hayır, genellikle yardımcı sınıflar final olarak tanımlanır, özel bir yapıcıyla birlikte. Statik metodların miras alınması mümkündür, ancak anlamlı değildir, çünkü statik metodlar nesne çağırma seviyesinde miras alınmaz.
Kod örneği:
public final class MyUtils { private MyUtils() {} // nesne oluşturmayı engeller }
Yardımcı Sınıflar durum içerebilir mi?
Hayır. Eğer bir yardımcı sınıf durum (instance veya static alanlar) içeriyorsa, bu, yardımcı yazma ilkesini ihlal eder, çoklu iş parçacığı hatalarına yol açar ve okunabilirliği azaltır.
Test sırasında yardımcı sınıfların statik metodları nasıl mock yapılabilir?
Sadece PowerMock gibi özel araçlar kullanılarak, bunlar testleri daha karmaşık ve bazen kararsız hale getirir. Normal durumlarda DI-friendly yaklaşım olan örnek kullanımı testler için daha tercih edilir.
Projedeki tüm servisler yardımcı statik metodlar ile uygulanmıştır. Bağımlılık enjekti edilemez, birim testler izole edilmemiştir, her test ortamın durumuna bağlıdır.
Artıları:
Eksileri:
Servislerde bağımlılık enjekti edilerek ayrı sınıflar kullanılır, arayüzler aracılığıyla yapılır. Dönüşümler ve basit işlemler için durum içermeyen yardımcı sınıflar kullanılır.
Artıları:
Eksileri: