
Envoyé par
guams
Les classes immuables me semblent à priori difficile à utiliser dans mon contexte vu que les champs de mes classes de données sont susceptibles d'etre mis à jour à differents moments dans mon appli, je ne peux donc pas tous les declarer final.
Tu peux faire cela par "contrat" sans pour autant les définir en final.
Deux solutions me viennent à l'esprit :
1. Tu peux utiliser la visibilité de "package" (pas de mot-clef) afin de ne rendre les méthodes mutateurs accessibles que par les classes du même package :
1 2 3 4 5 6 7 8 9 10 11
| public class MonObjet {
private String name;
public String getName() {
return this.name;
}
void setName(String newName) {
this.name = name;
} |
2. Tu peux utiliser une classe Wrapper pour empêcher la modification des données.
Par exemple tu as une interface qui définit seulement les méthodes d'accès aux attributs :
1 2 3 4 5
| public interface MonInterface {
public String getName();
} |
La classe principale que tu utilises dans ton application implémente cette interface mais implémente également les méthodes mutateurs dont tu as besoin :
1 2 3 4 5 6 7 8 9 10 11
| public class MonObjet implements MonInterface {
private String name;
public String getName() {
return this.name;
}
public void setName(String newName) {
this.name = name;
} |
Enfin, tu crée un classe wrapper immuable qui implémente l'interface et qui se contente de renvoyer tous les appels de méthodes défini dans l'interface vers la référence qui lui est passé :
1 2 3 4 5 6 7 8 9 10 11
| public final class MonObjetWrapper {
private final MonInterface inner;
public MonObjetWrapper(MonInterface inner) {
this.inner = inner;
}
public String getName() {
return this.inner.getName();
} |
Ainsi, lorsque tu dois passer un objet de type MonInterface aux plugins, tu lui passes à l'intérieur du wrapper.
Dans ton application :
MonObject obj = new MonObject();
Lorsque tu le passes à un plugins :
MonInterface wrapper = new MonObjetWrapper(obj);
a++
Partager