Как мне сделать Java-глубокую копию объекта? - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть класс (буквальный).Мне нужно иметь возможность хранить неповрежденный экземпляр Literal в памяти во всем приложении и иметь его копию, которую я могу изменить.Я использовал два способа сделать это:

  1. класс Literal реализует Cloneable и метод переопределения Object.clone().
  2. Конструктор фабрики:

    public Literal(Literal lit){
         this = lit;
    }
    

В обоих случаях копирование не работает.Каждое изменение, которое я делаю в копии, меняет оригинал.Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 21 декабря 2011

, поскольку Literal не является целочисленным типом, переменные типа Literal содержат ссылку на фактическое значение, поэтому this = lit просто копирует ссылку, поэтому ваше поведение.

Вы должны рекурсивно скопировать все поля-члены, чтобы сделать «настоящую» копию.

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

1 голос
/ 21 декабря 2011

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

Скажем, у вашего Literal есть переменные-члены, подобные этому:

private String[] args;
private String s;

Тогда ваш конструктор копирования должен будет сделать что-то вроде этого

public Literal(Literal l) {
  // have to deep copy the array, otherwise both instances are sharing the reference
  this.args = Arrays.copyOf(l.args, l.args.length);

  // safe to just copy the reference, String is immutable
  this.s = l.s;
}
...