首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的Memento模式-内部类的序列化

Java中的Memento模式-内部类的序列化
EN

Stack Overflow用户
提问于 2016-11-29 14:11:38
回答 1查看 472关注 0票数 0

免责声明--这是学校学期项目的一部分。

我们应该使用Memento模式来保存对象状态。这个对象是MVC中的一个模型。所以我现在的方法是(简化):

代码语言:javascript
复制
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
   }
}

我已经读过,在Java中有一个可序列化的内部类,而外部类却不是,这是不可能的,原因是合理的。但是,在我的例子中,当内部类是实例化时,我不需要实例化外部类。内在根本不需要外部。它只是这样的结构,以便外部类可以访问内部的成员。

这就是我的课程记忆描述中所说的:

..。这也是有道理的。只有模型才能访问Memento中的详细信息。“管理员”对象(一个处理保存/从磁盘中保存/检索数据的对象)不应该在对象内部看到。因为Java没有朋友类,所以应该这样做。

这是否意味着为了像建议的那样实现它,我不能使用序列化?

编辑:

我创建了Memento类静态,以及Stats类,但我仍然收到错误。在this中似乎还存在Model.Stats引用。

代码语言:javascript
复制
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", cz.melkamar.adp.shooter.model.Model$Stats@de1a1b8)
    - 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", cz.melkamar.adp.shooter.model.Model$Memento@1e920c72)
EN

回答 1

Stack Overflow用户

发布于 2016-11-29 14:25:16

非静态内部类的实例具有对其外部类实例的隐藏引用。这意味着,如果要序列化内部类的实例,则外部类的实例将与其一起序列化。如果外部类不可序列化,您将得到一个java.io.NotSerializableException

如果不希望外部类的实例与内部类的实例一起序列化,则使内部类static

代码语言:javascript
复制
public class Model {
   // ...
   public static class Memento implements Serializable {
       protected ModelData data;
       // ...
   }
}

static内部类没有对其外部类的实例的引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40867992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档