Haftungsausschluss - Dies ist ein Teil eines Schulsemesterprojekts.Memento-Muster in Java - Serialisierung der inneren Klasse
Wir sollten Memento-Muster verwenden, um einen Objektstatus zu speichern. Dieses Objekt ist ein Modell in MVC. So wie ich es jetzt haben, ist (vereinfacht):
public class Model {
// ...
public static class Memento implements Serializable {
protected Stats stats;
public Memento(Stats stats) {
this.stats = stats;
}
}
public static class Stats implements Serializable {
protected int score;
protected int cannonPos;
protected int cannonAngle;
protected int cannonSpeed;
protected int totalShotsFired = 0;
protected int enemiesHit;
protected transient List<StatsObserver> observers = new ArrayList<StatsObserver>();
// + getters etc
}
}
Ich habe gelesen, dass eine Serializable innere Klasse, die während der äußere Klasse ist nicht nicht wirklich möglich in Java für einen vernünftigen Gründen. ABER, in meinem Fall brauche ich nicht, dass die äußere Klasse instanziiert wird, wenn die innere Klasse ist. Innerlich braucht es überhaupt kein Äußeres. Es ist nur so strukturiert, dass die äußere Klasse auf die Mitglieder des Inneren zugreifen kann. Diese
ist, was ist meine natürlich Memento Beschreibung sagt:
... und das macht auch Sinn. Nur das Modell sollte auf die Details in Memento zugreifen können. Das "Caretaker" -Objekt (ein Objekt, das das Speichern/Abrufen der Daten von/zur Platte behandelt) sollte nicht innerhalb des Objekts sichtbar sein. Da Java keine Freundesklassen hat, sollte dies der richtige Weg sein.
Bedeutet es, dass ich Serialisierung nicht verwenden kann, um es wie vorgeschlagen zu implementieren?
Edit:
Ich machte Memento Klasse statisch, sowie Statistik-Klasse, aber ich bin immer noch den Fehler. Es scheint, dass es noch eine ist this
Referenz in Model.Stats
java.io.NotSerializableException: cz.melkamar.adp.shooter.model.Model
- field (class "cz.melkamar.adp.shooter.model.Model$Stats", name: "this$0", type: "class cz.melkamar.adp.shooter.model.Model")
- object (class "cz.melkamar.adp.shooter.model.Model$Stats", [email protected])
- field (class "cz.melkamar.adp.shooter.model.Model$Memento", name: "stats", type: "class cz.melkamar.adp.shooter.model.Model$Stats")
- root object (class "cz.melkamar.adp.shooter.model.Model$Memento", [email protected])
Ihre Klasse 'Model' oder ihre innere Klasse' Stats' hat Member oder (anonyme) innere Klassen, die Verweise auf Objekte enthalten, die nicht serialisierbar sind. – Jesper