Lo scopo principale di incapsulamento è di proteggere le varianti in-varianti di qualsiasi class
(in java).
Qui è il codice completo per class DList
/ class lockDList
/ class DListNode
/ class LockDListNode
.
class DList
e la sottoclasse class LockDList
ha le seguenti invarianti.
/* DList invariants:
* 1) sentinel != null.
* 2) For any DListNode x in a DList, x.next != null.
* 3) For any DListNode x in a DList, x.prev != null.
* 4) For any DListNode x in a DList, if x.next == y, then y.prev == x.
* 5) For any DListNode x in a DList, if x.prev == y, then y.next == x.
* 6) size is the number of DListNodes, NOT COUNTING the sentinel,
* that can be accessed from the sentinel (sentinel) by a sequence of
* "next" references.
*/
Ma l'utente di class LockDList
e class DList
può passare / ricevere il nodo elenco errato. Ciò porta a rompere l'incapsulamento a causa dell'unica ragione, ovvero in-varianti non protette , perché l'utente può passare il nodo sbagliato a class DList
o class LockDList
Ad esempio , sotto è il metodo pubblico next
in class DList
.
public DListNode next(DListNode node) {
if ((node == null) || (node.getNext() == this.sentinel)){
return null;
}else{
return node.getNext();
}
}
La maggior parte del codice di produzione tenta di introdurre un'implementazione O (1), mantenendo item
di class DListNode
come public
.
Esiste una decisione di progettazione che può essere suggerita per mantenere l'incapsulamento senza impatto sulle prestazioni?