* 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 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