Przeszukałem temat, ale poza Wikipedią nie znalazłem żadnej dalszej przydatnej dokumentacji ani artykułów.
Czy ktoś może mi wyjaśnić prostymi słowami, co to znaczy lub odesłać do jakiejś ładnej i łatwej do zrozumienia dokumentacji?
java
terminology
invariants
Saurabh Kumar
źródło
źródło
Odpowiedzi:
Nie ma to żadnego szczególnego znaczenia w odniesieniu do języka Java.
Niezmiennik klasy to po prostu właściwość, która zachowuje się dla wszystkich instancji klasy, zawsze, bez względu na to, co robi inny kod.
Na przykład,
class X { final Y y = new Y(); }
X ma niezmienną klasę, że istnieje
y
właściwość i nigdynull
jej nie ma i ma wartość typuY
.class Counter { private int x; public int count() { return x++; } }
nie zachowuje dwóch ważnych niezmienników
count
nigdy nie zwraca wartości ujemnej z powodu możliwego niedomiaru.count
są ściśle monotoniczne.Zmodyfikowana klasa zachowuje te dwa niezmienniki.
class Counter { private int x; public synchronized int count() { if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); } return x++; } }
ale nie zachowuje niezmiennika, który wywołania
count
zawsze kończą się normalnym powodzeniem (brak naruszeń TCB † ), ponieważcount
może zgłosić wyjątek lub może zablokować, jeśli wątek z zakleszczeniem jest właścicielem monitora licznika.Każdy język z klasami ułatwia utrzymanie pewnych niezmienników klas, a innych nie. Java nie jest wyjątkiem:
private
pola, więc niezmienniki, które opierają się na prywatnych danych, są łatwe w utrzymaniu.null
wartościom przemykać się na wiele sposobów, więc trudno jest zachować niezmienniki „ma rzeczywistą wartość”.† - Zewnętrzne lub naruszenie TCB to zdarzenie, które projektant systemów optymistycznie zakłada, że nie nastąpi.
Zwykle po prostu ufamy, że podstawowy sprzęt działa zgodnie z reklamą, gdy mówimy o właściwościach języków wysokiego poziomu zbudowanych na nich, a nasze argumenty, które utrzymują niezmienniki, nie uwzględniają możliwości:
setAccessible
do modyfikowaniaprivate
tabel przeglądowych.W przypadku niektórych systemów nasza TCB może zawierać tylko części systemu, więc możemy tego nie zakładać
ale możemy to założyć
Im system wyższego poziomu, tym zwykle jest większy jego TCB, ale im bardziej zawodne rzeczy można uzyskać z TCB, tym większe jest prawdopodobieństwo, że niezmienniki się utrzymają i tym bardziej niezawodny będzie system w dłuższej perspektywie.
źródło
count
nigdy nie zwraca tej samej wartości dwa razy” naprawdę jest uważane za niezmienną klasę?Niezmienny oznacza coś, co powinno trzymać się swoich warunków bez względu na zmiany lub tego, kto go używa / przekształca. Oznacza to, że właściwość klasy zawsze spełnia lub spełnia jakiś warunek, nawet po przejściu transformacji przy użyciu metod publicznych. Tak więc klient lub użytkownik tej klasy ma pewność co do klasy i jej własności.
Na przykład,
źródło
Są to fakty dotyczące klasy instancji, które muszą być prawdziwe. Na przykład, jeśli klasa ma właściwość X, a niezmiennik może mieć wartość X, musi być większa niż 0. O ile wiem, nie ma wbudowanej metody utrzymywania niezmienników, musisz ustawić właściwości jako prywatne i upewnić się, że metody pobierające i ustawiające wymuszają właściwość niezmienności.
Dostępne są adnotacje, które mogą sprawdzać właściwości za pomocą odbicia i przechwytywaczy. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
źródło