Java: глубокая копия объекта с элементом Runnable с конструктором копирования - PullRequest
0 голосов
/ 14 октября 2018

У меня есть класс character, для которого я хотел бы создать копию перед определенным событием, чтобы, если пользователь испортит, он мог повторить попытку с копией.Для реализации этого я использую конструктор копирования следующим образом:

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;
}

// ...
}

Однако я не знаю, как глубоко клонировать объект Runnable.Как я могу их глубоко скопировать?Это вообще возможно при использовании конструктора копирования?

Я заметил, что Runnable отличается от других членов character тем, что интересующая его часть хранится внутри функции, а не атрибута ...

1 Ответ

0 голосов
/ 15 октября 2018

Если единственное, что вы знаете о, скажем, combatAI, это то, что это Runnable, то вы не можете глубоко копировать его - у него нет глубины, так сказать - это просто Runnable.

Вы можете переосмыслить этот подход и явно иметь контрольные точки в игре (?), Чтобы вы могли создать combatAI и остальную часть состояния из данных контрольных точек.

Также обратите внимание, что ваша копия inventory имеет глубину всего один уровень, оригинал и новые character s имеют одинаковые item s.То же самое дело с companions

...