Question

Quand je passe un objet de type immuable (string, integer, ..) sous la forme finale d'un procédé je peux réaliser les caractères d'un pointeur constant de C. Mais comment puis-je appliquer un tel comportement dans les objets qui sont mutable?

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

Tout ce que je veux est d'empêcher someMethod de modifier l'état de someObject sans faire aucun changement UnType. Est-ce possible?

Était-ce utile?

La solution

Non, je ne pense pas que ce soit possible. L'approche normale est de créer un adaptateur pour UnType où toutes les méthodes de changement d'état jette UnsupportedOperationException. Il est utilisé par exemple java.util.Collections.unmodifiable * -functions.

Il existe plusieurs approches à ceci:

  • vous pouvez laisser UnType être une interface, et quand vous avez besoin d'être en lecture seule, il suffit de créer un emballage déléguant toutes les lectures méthodes de l'objet d'origine et mettre en œuvre toutes les réductions de méthodes pour lancer une exception.
  • ou vous pouvez créer une sous-classe de UnType remplaçant toutes les méthodes d'écriture

Ce sera bien sûr seulement vous donner la gestion du temps à vérifier, non compiletime. Si vous voulez la compilation, vous pouvez laisser UnType être une interface (ou une superclasse) sans écriture-méthodes, en lecture seule.

Autres conseils

Dans le cas général, non, il est impossible. Dans un cas très limité, vous pouvez envelopper UnType dans une classe qui fournit la même interface (voir un exemple Collections.unmodifiableList ()).

Cependant, il n'y a pas d'équivalent à « passer un pointeur const et le compilateur ne vous permettent d'appeler des fonctions const là-dessus ».

Non, vous ne pouvez pas empêcher l'objet modifié par ses méthodes setXXX () (ou similaire). Vous pouvez remettre un clone ou une copie de celui-ci, cependant.

Non, il est impossible. Vous devez passer soit dans une copie de l'objet, ou tout simplement compter sur le savoir quelles actions font des changements d'état à l'objet et éviter de les appeler -. Le compilateur ne vous aidera pas

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top