![translation](https://cdn.durumis.com/common/trans.png)
Bu, AI tarafından çevrilen bir gönderidir.
Dil Seç
Text summarized by durumis AI
- Tekil, yalnızca bir örnek oluşturulabilen bir sınıftır ve durumsuz nesneler veya benzersiz sistem bileşenleri oluşturmak için kullanılır.
- Tekil oluşturmanın yolları arasında public static üyenin final alan olması, statik fabrika yöntemi sağlamak ve sayım türü kullanmak bulunur ve sayım türü kullanmak en uygun yoldur.
- Tekil sınıfı seri hale getirmek için, Serializable uygulaması gerekir ve tüm örnek alanları transient olarak bildirilmeli ve readResolve() yöntemi yeniden tanımlanmalıdır.
Tekil
Tekil Kavramı
Tekil, yalnızca bir örnek oluşturulabilen bir sınıfı ifade eder. Tekillerin tipik bir örneği, durumsuz nesneler veya benzersiz sistem bileşenleridir. Ancak tekil sınıflar, türü bir arayüz olarak tanımlayıp bunun uygulaması olarak tanımlamadıkça test edilmesi zor bir soruna sahiptir.
Tekil Oluşturma Yöntemleri
public static üyesi final alan olan yöntem
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void speak() {
System.out.println("elvis");
}
Özel oluşturucu, Elvis örneğini başlatırken yalnızca bir kez çağırılır ve tüm sistemde benzersiz bir örnek olmasını sağlar. Ancak, AccessibleObject.setAccessible() kullanarak özel oluşturucuyu çağırmak mümkündür. Bu tür yansımalar aracılığıyla değiştirme yöntemi, ikinci nesnenin oluşturulması sırasında bir istisna fırlatılarak engellenebilir.
- Avantajlar
- Sınıfın tekil olduğu API'de açıkça gösterilir.
- Kısa ve öz.
Statik fabrika yöntemini public static olarak sağlayan yöntem
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public static Elvis getInstance() {
return INSTANCE;
}
public void speak() {
System.out.println("elvis");
}
Yansıma yoluyla yapılan değişiklikler dışında bu yöntem de tüm sistemde benzersiz bir örnek olmasını sağlar. Sadece alanı özel olarak değiştiriyor ve nesneyi döndürmek için statik fabrika yöntemi kullanılıyor.
- Avantajlar
- API'yi değiştirmeden tekil olmaktan çıkarılabilir.
- Örneğin, statik fabrika yönteminin her bir iş parçacığı için farklı bir örnek döndürmesi sağlanabilir.
- İstenirse, genel bir tekil fabrika yöntemi olarak değiştirilebilir.
- Statik fabrikanın yöntem başvurusu sağlayıcı olarak kullanılabilir.
- Örneğin, Elvis::getInstance yerine Supplier<Elvis> olarak kullanılabilir.
- API'yi değiştirmeden tekil olmaktan çıkarılabilir.
Yukarıdaki avantajlardan yararlanmak gerekmiyorsa, ilk yöntemi kullanmak daha iyidir.
Numaralandırma türünü kullanan yöntem
public enum Elvis {
INSTANCE;
public void speak() {
System.out.println("elvis");
}
En uygun yöntem, numaralandırma türünü kullanmaktır. Yukarıdaki iki yönteme kıyasla yansıma saldırılarına karşı daha güvenlidir ve kod daha temizdir. Ayrıca, aşağıda ayrıntılı olarak ele alınacak olsa da, yukarıdaki iki yöntemin seri hale getirilmesi sırasında ek kod eklenmesi gerektiği dezavantajı vardır.
Ancak, oluşturulmak istenen tekilin bir arayüzü devralması mümkündür, ancak bir sınıfı devralması mümkün değildir.
Tekil Sınıfların Seri Hale Getirilmesinde Dikkat Edilmesi Gereken Noktalar
Yukarıdaki yöntemlerden biri veya ikincisi kullanılarak oluşturulan tekil sınıflar seri hale getirilmek isteniyorsa, yalnızca Serializable'ı uygulamanın yanı sıra, tüm örnek alanları transient olarak ilan edilmeli ve readResolve() yöntemi yeniden tanımlanarak sağlanmalıdır.
private Object readResolve throws ObjectStreamException {
return INSTANCE;