Frage

Als ich ein unveränderliches Typ-Objekt übergeben (String, Integer, ..) als endgültig auf ein Verfahren kann ich die Zeichen eines C ++ konstanten Zeiger erzielen. Aber wie kann ich ein solches Verhalten in Objekten erzwingen, die wandelbar sind?

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

Alles, was ich will, ist irgendeinemethode aus Modifizieren des Zustands von Someobject zu verhindern, ohne eine Änderung in sometype zu machen. Ist das möglich?

War es hilfreich?

Lösung

Nein, ich glaube nicht, das ist möglich. Der normale Ansatz ist es, einen Adapter für Sometype zu schaffen, in dem alle Methoden Zustand ändert UnsupportedOperationException wirft. Dies wird verwendet, um zum Beispiel java.util.Collections.unmodifiable * -Funktionen.

Es gibt mehrere Ansätze, um diese:

  • Sie lassen Sometype eine Schnittstelle sein, und wenn Sie es brauchen nur gelesen werden, erstellen Sie einfach einen Wrapper alle schreib Methoden auf das ursprüngliche Objekt zu delegieren und alle Schreib Methoden der Umsetzung einer Ausnahme zu werfen.
  • oder Sie können eine Unterklasse von Sometype schaffen zwingende alle Schreibmethoden

Dies wird natürlich nur geben Sie Laufzeitprüfung, nicht compiletime. Wenn Sie kompilieren Zeit möchten, können Sie lassen Sometype eine Schnittstelle (oder eine übergeordnete Klasse) ohne Schreibmethoden, nur gelesen werden.

Andere Tipps

Im allgemeinen Fall, nein, es ist nicht möglich. In einem sehr begrenzten Fall können Sie sometype in einer Klasse wickeln, die die gleiche Schnittstelle bietet (siehe Collections.unmodifiableList () für ein Beispiel).

Allerdings gibt es kein Äquivalent zu „ein const Zeiger übergeben und der Compiler können Sie nur const Funktionen nennen“.

Nein, Sie können nicht verhindern, dass das Objekt über seine setXXX modifiziert werden () (oder ähnlich) Methoden. Sie könnten in einem Klon der Hand oder eine Kopie davon, though.

Nein, es ist nicht möglich. Sie müssen entweder in einer Kopie des Objekts übergeben, oder einfach nur verlassen, zu wissen, welche Aktionen Zustandsänderungen an dem Objekt machen und verhindern, dass sie fordern -. Der Compiler wird nicht helfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top