Co to jest niezmiennik klasy w Javie?
Wygooglowałem temat, ale poza Wikipedią nie znalazłem żadnej innej przydatnej dokumentacji ani artykułów.
Czy ktoś może mi wyjaśnić prostymi słowami co to znaczy lub skierować mnie do jakiejś miłej i łatwej do zrozumienia dokumentacji?
3 answers
Nie oznacza to nic szczególnego w odniesieniu do Javy.
Niezmiennik klasy jest po prostu właściwością, która przechowuje wszystkie instancje klasy, zawsze, bez względu na to, co robi inny kod.
Na przykład,
class X {
final Y y = new Y();
}
X ma niezmiennik klasy, że istnieje właściwość y
i nigdy nie jest null
i ma wartość typu Y
.
class Counter {
private int x;
public int count() { return x++; }
}
Nie zachowuje dwóch ważnych niezmienników
- że
count
nigdy nie zwraca wartości ujemnej z powodu możliwe niedotlenienie. - że połączenia do
count
są ściśle monotonicznie rosnące.
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łuje count
zawsze udaje się normalnie (brak naruszeń TCB†) ponieważ count
może rzucić wyjątek lub zablokować, jeśli zablokowany wątek posiada monitor licznika.
Każdy język z klasami ułatwia utrzymanie niektórych niezmienników klas, ale Nie inni. Java nie jest wyjątkiem:
- klasy Javy konsekwentnie mają lub nie mają właściwości i metod, więc niezmienniki interfejsu są łatwe w utrzymaniu.
- klasy Java mogą chronić swoje pola
private
, więc niezmienniki bazujące na prywatnych danych są łatwe w utrzymaniu. - klasy Javy mogą być ostateczne, więc niezmienniki, które polegają na tym, że nie ma kodu, który narusza niezmiennik tworząc złośliwą podklasę, mogą być utrzymywane.
- Java pozwala
null
wartościom na zakradać się na wiele sposobów, więc trudno jest utrzymać niezmienniki "ma prawdziwą wartość". - Java ma wątki, co oznacza, że klasy, które nie synchronizują się, mają problemy z utrzymaniem niezmienników, które polegają na sekwencyjnych operacjach w wątku zachodzących razem.
- Java ma wyjątki, które ułatwiają utrzymanie niezmienników, takich jak" zwraca wynik z właściwością p lub nie zwraca wyniku", ale trudniej utrzymać niezmienniki, takie jak"zawsze zwraca wynik".
† - An lub TCB violation to zdarzenie, które projektant systemów optymistycznie zakłada, że nie nastąpi.
Zazwyczaj 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 biorą pod uwagę możliwości: {15]}
- programista używający hooków debugowania do zmiany lokalnych zmiennych, gdy program działa w sposób, który koduje nie mogę.
- twoi rówieśnicy nie używają reflection z
setAccessible
do modyfikowania tabel wyszukiwaniaprivate
. - Loki zmienia fizykę, powodując, że procesor błędnie porównuje dwie liczby.
Dla niektórych systemów nasz TCB może obejmować tylko części systemu, więc nie możemy zakładać, że
- Administrator lub uprzywilejowany demon nie zabije naszego procesu JVM,]}
Ale możemy założyć, że
- możemy sprawdzić wiarygodną transakcję system plików.
Im wyższy poziom systemu, tym większy jest jego TCB, ale im bardziej zawodne rzeczy można uzyskać z TCB, tym bardziej prawdopodobne jest, że Twoje niezmienniki będą trzymać i tym bardziej niezawodny będzie Twój system na dłuższą metę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-29 21:13:48
Niezmiennik oznacza coś, co powinno trzymać się swoich warunków bez względu na to, co się zmienia lub kto go używa / przekształca. To znaczy, własność klasy zawsze spełnia lub spełnia jakiś warunek nawet po przejściu transformacji za pomocą metod publicznych. Tak więc klient lub użytkownik tej klasy jest zapewniony o klasie i jej właściwościach.
Na przykład,
- warunkiem argumentu funkcji jest to, że zawsze powinno być > 0 (większe niż zero) lub nie powinno bądź null.
- właściwość minimum_account_balance klasy konta mówi, że nie może być niższa niż 100. Zatem wszystkie funkcje publiczne powinny respektować ten warunek i zapewnić niezmienność klasy.
- zależność między zmiennymi oparta na regułach, tzn. wartość jednej zmiennej zależy od drugiej, więc jeśli jedna się zmienia, używając jakiejś reguły fix, Inna również musi się zmienić. Ta zależność między 2 zmiennymi musi być zachowana. Jeśli tak nie jest, to niezmienny jest naruszany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-25 08:48:16
Są to fakty, które muszą być prawdziwe o klasie instancji. Na przykład, jeśli klasa ma właściwość X i niezmienna może być X musi być większa niż 0. Według mojej wiedzy nie ma wbudowanej metody utrzymywania niezmienników musisz uczynić własność prywatną i upewnić się, że Twoje gettery i settery wymuszają własność niezmienniczą.
Dostępne są adnotacje, które mogą sprawdzać właściwości za pomocą refleksji i przechwytujące. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 13:26:06