Скопируйте объект в другой - PullRequest
6 голосов
/ 29 марта 2010

Есть ли общий способ добиться копирования существующего объекта в другой?

Предположим, MyObj имеет поля id и name. Как это:

MyObj myObj_1 = new MyObj(1, "Name 1");
MyObj myObj_2 = new MyObj(2, "Name 2");

Вместо

myObj_2.setName(myObj_1.getName()) // etc for each field

сделать что-то следующим образом:

myObj_2.copyFrom(myObj_1)

так, чтобы они были разными экземплярами, но имели равные свойства.

Ответы [ 6 ]

8 голосов
/ 29 марта 2010

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

MyObj myObj_2 = новый MyObj (myObj_1);

Нет Java-соглашения о перезаписи существующих свойств объекта другим. Это идет вразрез с предпочтением неизменяемых объектов в Java (где свойства устанавливаются во время конструирования, если нет веской причины не делать этого).

Редактировать: что касается clone (), многие инженеры не одобряют это в современной Java, потому что она имеет устаревший синтаксис и другие недостатки. http://www.javapractices.com/topic/TopicAction.do?Id=71

7 голосов
/ 29 марта 2010

Использовать конструктор копирования:

public class YourObject {
  private String name;
  private int age;

  public YourObject(YourObject other) {
     this.name = other.name;
     this.age = other.age;
  }
}
4 голосов
/ 29 марта 2010
0 голосов
/ 18 февраля 2018

Метод clone() лучше всего подходит для этих требований. Каждый раз, когда метод clone() вызывается для объекта, JVM фактически создает новый объект и копирует все содержимое предыдущего объекта во вновь созданный объект. Перед использованием метода clone() необходимо реализовать интерфейс Cloneable и переопределить метод clone().

public class CloneExample implements Cloneable
{
    int id;
    String name;

    CloneExample(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        CloneExample obj1 = new CloneExample(1,"Name_1");

        try {
            CloneExample obj2 = (CloneExample) obj1.clone();
            System.out.println(obj2.id);
            System.out.println(obj2.name);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 29 марта 2010

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

0 голосов
/ 29 марта 2010

Метод clone () предназначен именно для этой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...