Konuyu Google'da araştırdım, ancak Wikipedia'nın yanı sıra başka yararlı belge veya makale bulamadım.
Biri bana bunun ne anlama geldiğini basit bir şekilde açıklayabilir veya beni güzel ve anlaşılması kolay bazı belgelere yönlendirebilir mi?
Konuyu Google'da araştırdım, ancak Wikipedia'nın yanı sıra başka yararlı belge veya makale bulamadım.
Biri bana bunun ne anlama geldiğini basit bir şekilde açıklayabilir veya beni güzel ve anlaşılması kolay bazı belgelere yönlendirebilir mi?
Yanıtlar:
Özellikle Java ile ilgili olarak hiçbir şey ifade etmiyor.
Bir sınıf değişmezi, başka bir kod ne yaparsa yapsın, her zaman bir sınıfın tüm örneklerini tutan bir özelliktir.
Örneğin,
class X {
final Y y = new Y();
}
X, bir y
özellik olduğuna dair sınıf değişmezine sahiptir ve hiçbir zaman yoktur null
ve bir tür değerine sahiptir Y
.
class Counter {
private int x;
public int count() { return x++; }
}
Bu, iki önemli değişmezi korumayı başaramaz:
count
, olası yetersizlik nedeniyle asla negatif bir değer döndürmez.count
kesinlikle monoton bir şekilde artıyor.Değiştirilmiş sınıf, bu iki değişmezi korur.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
... ancak count
her zaman normal şekilde başarılı olma çağrısı yapan değişmezi koruyamaz (TCB ihlalleri † ), çünkü count
bir istisna atabilir veya kilitli bir iş parçacığının sayacın monitörüne sahip olması durumunda engelleyebilir.
Sınıfları olan her dil, bazı sınıf değişmezlerini korumayı kolaylaştırırken bazılarını korumayı kolaylaştırır. Java bir istisna değildir:
private
alanlarını koruyabilir , bu nedenle özel verilere dayanan değişmezlerin bakımı kolaydır.null
değerlerin birçok şekilde gizlice girmesine izin verir , bu nedenle "gerçek bir değere sahip" değişmezlerini korumak zordur.† - Bir dışsallık veya TCB ihlali , bir sistem tasarımcısının iyimser bir şekilde olmayacağını varsaydığı bir olaydır.
Tipik olarak, temel donanımın, üzerlerine inşa edilen yüksek seviyeli dillerin özellikleri hakkında konuşurken reklamı yapıldığı gibi çalıştığına ve değişmezlerin sahip olduğu argümanlarımızın şu olasılıkları hesaba katmadığına güveniyoruz:
setAccessible
değiştirmek için yansıma kullanmaz private
.Bazı sistemler için TCB'miz sistemin yalnızca parçalarını içerebilir, bu nedenle şunu varsaymayabiliriz:
... ancak şunu varsayabiliriz:
Bir sistem ne kadar yüksek seviyeli olursa, TCB'si tipik olarak o kadar büyüktür, ancak TCB'nizden ne kadar güvenilmez şeyler elde ederseniz, değişmezlerinizin tutma olasılığı o kadar artar ve uzun vadede sisteminiz o kadar güvenilir olur.
count
Asla aynı değeri iki kez döndürmeyen" gerçekten bir sınıf değişmezi olarak kabul edilir mi?
Değişmezlik, değişen veya onu kullanan / dönüştüren ne olursa olsun koşullarına bağlı kalması gereken bir şey anlamına gelir. Yani, bir sınıfın bir özelliği, kamusal yöntemler kullanılarak dönüşümlerden geçtikten sonra bile her zaman bazı koşulları yerine getirir veya karşılar. Böylece, bu sınıfın müşterisi veya kullanıcısı, sınıf ve mülkiyeti konusunda güvence altına alınır.
Örneğin,
Bir örnek sınıfı hakkında doğru olması gereken gerçeklerdir. Örneğin, bir sınıf X özelliğine sahipse ve değişmez X, 0'dan büyük olmalıdır. Bildiğim kadarıyla, değişmezleri korumak için yerleşik bir yöntem yoktur, özellikleri özel yapmalı ve alıcılarınızın ve ayarlayıcılarınızın değişmezlik özelliğini uyguladığından emin olmalısınız.
Yansıma ve durdurucuları kullanarak özellikleri kontrol edebilen ek açıklamalar vardır. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html