All pastes #796731 Raw Edit

Something

public text v1 · immutable
#796731 ·published 2007-11-25 09:56 UTC
rendered paste body
* Toutes les classes qui mappent une table doivent étendre ProtectedData

* Chaque méthode setter de ces classes doit commencer par :

public void setXxx(....) {
  if (!isEditable())
    throwDataUneditableException();
  ...
}

(On lance une exception si l'objet est en mode "read-only")

* Utilisation :

Message m = new Message("hey", "cool", new Date().getTime() / 1000, 1, 2);
m.setContent("great"); // OK, l'objet n'est pas protégé (il n'a pas été enregistré dans les CAO/DAO)
DataAccess.create(m);
m.setContent("super"); // Erreur, lance une exception car l'objet a été enregistré dans les CAO/DAO et est passé en mode read-only)
m = DataAccess.getEditable(m); // Renvoie une copie éditable de m
m.setContent("woohoo"); // OK, l'objet est éditable
DataAccess.update(m);
m.setContent("yay"); // Erreur, l'objet a été enregistré et n'est pas éditable
DataAccess.delete(m);
m.setContent("woot"); // OK, l'objet n'est plus enregistré dans les CAO/DAO

De même :
Message m = DataAccess.getMessageById(10);
m.setContent("yo"); // Erreur, l'objet est en mode read-only
List<Message> msg = DataAccess.getMessagesByPlayer(1);
msg.get(0).setContent("yay"); // Idem

* Intéret : les CAO / DAO peuvent renvoyer les objets par référence en étant garantis qu'ils ne seront pas modifiés. S'ils n'étaient pas en mode read-only, on pourrait faire :

Message m = DataAccess.getMessageById(10);
m.setContent("yo");

Et le message dans le CAO aurait été modifié alors qu'il n'y pas eu de DataAccess.update(m).
On peut simplement obtenir un objet en créant une copie de l'objet, sur laquelle on pourra travailler sans impacter les CAO/DAO :

Message m = DataAccess.getMessageById(10);
Message m2 = DataAccess.getEditable(m); // m2 est une copie éditable de m