Java:具有可运行成员和复制构造函数的对象的深度复制

Java:具有可运行成员和复制构造函数的对象的深度复制,java,copy-constructor,runnable,deep-copy,Java,Copy Constructor,Runnable,Deep Copy,我有一个类字符,我想在某个事件之前创建一个副本,这样,如果用户搞砸了,他可以用副本重试。为了实现这一点,我使用如下复制构造函数: public class character implements Serializable { private String name; private HashMap<String,Integer> values = new HashMap<>(); private

我有一个类
字符
,我想在某个事件之前创建一个副本,这样,如果用户搞砸了,他可以用副本重试。为了实现这一点,我使用如下复制构造函数:

public class character
    implements Serializable
{
private String                          name;
private HashMap<String,Integer>         values = new HashMap<>();
private ArrayList<String>               traits = new ArrayList<>();
private enums.playerRelations           playerRelation;
private static character                playerCharacter = new character();
private transient Runnable              combatAI;
private transient Runnable              tradingAI;
private ArrayList<character>            companions = new ArrayList<>();
private ArrayList<item>                 inventory = new ArrayList<>();
private int                             maximumInventorySize = 20;
private int                             maximumSkillSlots = 10;
private transient ArrayList<Pair<skill,Boolean>>  skills = new ArrayList<>();
private int                             portraitResource = R.drawable.ic_bear;
private event                           eventContext;

public character(character o)
{
    name                    = o.name;
    values                  = new HashMap<>(o.values);
    traits                  = new ArrayList<>(o.traits);
    playerRelation          = o.playerRelation;
    combatAI                = o.combatAI;
    tradingAI               = o.tradingAI;
    companions              = new ArrayList<>(o.companions);
    inventory               = new ArrayList<>(o.inventory);
    maximumInventorySize    = o.maximumInventorySize;
    maximumSkillSlots       = o.maximumSkillSlots;
    skills                  = new ArrayList<>(o.skills);
    portraitResource        = o.portraitResource;
    eventContext            = o.eventContext;
}

// ...
}
公共类字符
实现序列化接口
{
私有字符串名称;
私有HashMap值=新HashMap();
private ArrayList traits=new ArrayList();
私有enums.playerRelations playerRelations;
私有静态角色playerCharacter=新角色();
私人临时作战;
私人临时可运行交易;
private ArrayList compartments=new ArrayList();
私有ArrayList清单=新ArrayList();
private int maximumInventorySize=20;
专用int maximumSkillSlots=10;
私有临时ArrayList skills=新建ArrayList();
私有资源=R.drawable.ic_熊;
私人事件背景;
公众人物(o字)
{
name=o.name;
值=新的HashMap(o.values);
traits=newarraylist(o.traits);
playerRelation=o.playerRelation;
战斗=作战;
tradingAI=o.tradingAI;
同伴=新阵列列表(o.同伴);
库存=新阵列列表(o.库存);
maximumInventorySize=o.maximumInventorySize;
maximumSkillSlots=o.maximumSkillSlots;
skills=新ArrayList(o.skills);
肖像资源=o.肖像资源;
eventContext=o.eventContext;
}
// ...
}
但是,我不知道如何深度克隆
Runnable
对象。我怎样才能深度复制这些?使用复制构造函数可以吗


我注意到
Runnable
不同于
character
的其他成员,因为关注的部分存储在函数中而不是属性中…

如果您只知道,
combatAI
就是它是
可运行的
那么你就不能深度复制它-可以说它没有深度-它只是
可运行的

您可能需要重新考虑这种方法,并在游戏中明确设置检查点(?),以便您可以根据检查点数据创建
战斗
和其他状态


还要注意的是,您的
库存
副本只有一级深,原始和新
字符
s共享相同的
项目
s。与
同伴的相同处理

不要使用
可运行
,而是使用您自己的策略界面,其中包括适当的克隆方法。顺便说一句,您的类看起来负载过重,拆分和/或分组属性将是一种改进。