Ho cercato su Google l'argomento, ma oltre a Wikipedia non ho trovato ulteriore documentazione o articoli utili.
Qualcuno può spiegarmi in parole semplici cosa significa o rimandarmi a una documentazione carina e di facile comprensione?
Ho cercato su Google l'argomento, ma oltre a Wikipedia non ho trovato ulteriore documentazione o articoli utili.
Qualcuno può spiegarmi in parole semplici cosa significa o rimandarmi a una documentazione carina e di facile comprensione?
Risposte:
Non significa niente in particolare in riferimento a java.
Una classe invariante è semplicemente una proprietà che vale per tutte le istanze di una classe, sempre, indipendentemente da ciò che fa l'altro codice.
Per esempio,
class X {
final Y y = new Y();
}
X ha la classe invariante che esiste una y
proprietà e non lo è mai null
e ha un valore di tipo Y
.
class Counter {
private int x;
public int count() { return x++; }
}
non riesce a mantenere due importanti invarianti
count
restituisce mai un valore negativo a causa di un possibile underflow.count
stanno aumentando rigorosamente monotonicamente.La classe modificata conserva questi due invarianti.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
ma non riesce a preservare l'invariante che chiama per count
avere sempre successo normalmente (assente TCB-violazioni † ) perché count
potrebbe generare un'eccezione o potrebbe bloccarsi se un thread con deadlock possiede il monitor del contatore.
Ogni lingua con le classi rende facile mantenere alcune invarianti di classe ma non altre. Java non fa eccezione:
private
campi, quindi le invarianti che si basano su dati privati sono facili da mantenere.null
valori di entrare di nascosto in molti modi, quindi è difficile mantenere invarianti "ha un valore reale".† - Una violazione di esternalità o TCB è un evento che un progettista di sistemi presume ottimisticamente non accadrà.
In genere ci fidiamo solo del fatto che l'hardware di base funzioni come pubblicizzato quando si parla di proprietà di linguaggi di alto livello costruiti su di essi, e le nostre argomentazioni che valgono le invarianti non tengono conto della possibilità di:
setAccessible
per modificare private
le tabelle di ricerca.Per alcuni sistemi il nostro TCB potrebbe includere solo parti del sistema, quindi potremmo non assumerlo
ma potremmo presumere che
Più alto è un sistema, più grande è il suo TCB in genere, ma più cose inaffidabili puoi ottenere dal tuo TCB, più è probabile che i tuoi invarianti siano mantenuti e più affidabile sarà il tuo sistema a lungo termine.
count
non restituisce mai due volte lo stesso valore" è davvero considerato una classe invariante?
Invariante significa qualcosa che dovrebbe attenersi alle sue condizioni, indipendentemente da qualsiasi cambiamento o da chiunque lo usi / trasformi. Vale a dire, una proprietà di una classe soddisfa o soddisfa sempre alcune condizioni anche dopo aver attraversato trasformazioni utilizzando metodi pubblici. Quindi, il cliente o l'utente di questa classe è assicurato sulla classe e sulla sua proprietà.
Per esempio,
Sono fatti che devono essere veri su una classe di istanza. Ad esempio, se una classe ha una proprietà X e invariante può essere X deve essere maggiore di 0. Per quanto ne so non esiste un metodo integrato per mantenere invarianti, devi rendere le proprietà private e assicurarti che i tuoi getter e setter applichino la proprietà di invarianza.
Sono disponibili annotazioni che possono controllare le proprietà utilizzando la riflessione e gli intercettori. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html