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?

Author: nbro, 2012-01-18

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

  1. że count nigdy nie zwraca wartości ujemnej z powodu możliwe niedotlenienie.
  2. ż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:

  1. klasy Javy konsekwentnie mają lub nie mają właściwości i metod, więc niezmienniki interfejsu są łatwe w utrzymaniu.
  2. klasy Java mogą chronić swoje pola private, więc niezmienniki bazujące na prywatnych danych są łatwe w utrzymaniu.
  3. 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.
  4. Java pozwala null wartościom na zakradać się na wiele sposobów, więc trudno jest utrzymać niezmienniki "ma prawdziwą wartość".
  5. 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.
  6. 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 wyszukiwania private.
  • 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ę.

 73
Author: Mike Samuel,
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,

  1. warunkiem argumentu funkcji jest to, że zawsze powinno być > 0 (większe niż zero) lub nie powinno bądź null.
  2. 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.
  3. 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.
 9
Author: aab10,
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

 9
Author: Usman Ismail,
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