Domanda

Quando passo un tipo di oggetto immutabile (stringa, intero ..) come definitiva ad un metodo posso raggiungere i caratteri di una C ++ puntatore costante. Ma come faccio a far rispettare tale comportamento negli oggetti che sono mutabili?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

Tutto quello che voglio è quello di prevenire someMethod di modificare lo stato di someObject senza fare alcun cambiamento nella sometype. È possibile?

È stato utile?

Soluzione

No, non credo che questo sia possibile. L'approccio normale è quello di creare un adattatore per SomeType in cui tutti i metodi di cambiamento di stato getta UnsupportedOperationException. Questo è usato, ad esempio java.util.Collections.unmodifiable * -Funzioni.

Ci sono diversi approcci a questo:

  • si può lasciare SomeType essere un'interfaccia, e quando ne avete bisogno di essere letto solo, basta creare un wrapper delegando tutti i-metodi di lettura per l'oggetto originale e l'attuazione di tutte le rettifiche di metodi per generare un'eccezione.
  • oppure è possibile creare una sottoclasse di SomeType override tutti i metodi di scrittura

Ovviamente questo solo darvi run-time controllo, non compiletime. Se si desidera che a tempo di compilazione, si può lasciare SomeType essere un'interfaccia (o una superclasse) senza riprese di metodi, di sola lettura.

Altri suggerimenti

Nel caso generale, no, non è possibile. In un caso molto limitato, si può avvolgere sometype in una classe che fornisce la stessa interfaccia (vedi Collections.unmodifiableList () per un esempio).

Tuttavia, non c'è alcun equivalente a "passare un puntatore const e il compilatore solo permetterà di chiamare funzioni const su di esso".

No, non si può evitare che l'oggetto che viene modificato tramite il suo setXXX () (o simili) metodi. Si potrebbe consegnare un clone o una copia di esso, però.

No, non è possibile. Devi passare sia in una copia dell'oggetto, o semplicemente affidarsi a sapere quali azioni fanno i cambiamenti di stato all'oggetto ed evitare di chiamarli -. Il compilatore non vi aiuterà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top