Скопируйте объект в Java

Вы можете сделать следующее:

this.activatedRoute.queryParams.subscribe((params: Params) => {
      this.param = params['name'];

    }).unsubscribe();
  }

Это чувствительно к регистру

20
задан mayooran 17 November 2016 в 04:49
поделиться

5 ответов

Существует два популярных подхода. Нужно обеспечить clone метод, как Вы упомянули, как так.

public class C implements Cloneable {
    @Override public C clone() {
        try {
            final C result = (C) super.clone();
            // copy fields that need to be copied here!
            return result;
        } catch (final CloneNotSupportedException ex) {
            throw new AssertionError();
        }
}

Обращают внимание на "поля копии... здесь!" часть. Начальная буква result является только мелкой копией, означая что, если будет ссылка на объект, то и оригинал и result совместно использует тот же объект. Например, если бы C содержит private int[] data, Вы, вероятно, хотели бы скопировать это.

...
final C result = (C) super.clone();
result.data = data.clone();
return result;
...

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

второй подход должен предоставить конструктору копии.

public class C {
    public C(final C c) {
        // initialize this with c
    }
}

Или фабрика копии.

public class C {
    public static C newInstance(final C c) {
        return new C(c);
    }

    private C(final C c) {
        // initialize this with c
    }
}

Оба подхода имеют свои соответствующие свойства. clone хорошо, потому что это - метод, таким образом, Вы не должны знать точный тип. В конце необходимо всегда заканчивать с "идеальной" копией. Конструктор копии хорош, потому что у вызывающей стороны есть шанс решить, как видно Наборами Java.

final List c = ... 
// Got c from somewhere else, could be anything.
// Maybe too slow for what we're trying to do?

final List myC = new ArrayList(c);
// myC is an ArrayList, with known properties

я рекомендую выбрать любой подход, какой бы ни подходит Вам лучше.

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

20
ответ дан 29 November 2019 в 22:33
поделиться

Другая опция при помощи Конструктора Копии (от Методы Java ):

public final class Galaxy {

    public Galaxy (double aMass, String aName) {
        fMass = aMass;
        fName = aName;
    }

    /**
    * Copy constructor.
    */
    public Galaxy(Galaxy aGalaxy) {
        this(aGalaxy.getMass(), aGalaxy.getName());
        //no defensive copies are created here, since 
        //there are no mutable object fields (String is immutable)
    }

    /**
    * Alternative style for a copy constructor, using a static newInstance
    * method.
    */
    public static Galaxy newInstance(Galaxy aGalaxy) {
        return new Galaxy(aGalaxy.getMass(), aGalaxy.getName());
    }

    public double getMass() {
        return fMass;
    }

    /**
    * This is the only method which changes the state of a Galaxy
    * object. If this method were removed, then a copy constructor
    * would not be provided either, since immutable objects do not
    * need a copy constructor.
    */
    public void setMass( double aMass ){
        fMass = aMass;
    }

    public String getName() {
        return fName;
    }

    // PRIVATE /////
    private double fMass;
    private final String fName;

    /**
    * Test harness.
    */
    public static void main (String... aArguments){
        Galaxy m101 = new Galaxy(15.0, "M101");

        Galaxy m101CopyOne = new Galaxy(m101);
        m101CopyOne.setMass(25.0);
        System.out.println("M101 mass: " + m101.getMass());
        System.out.println("M101Copy mass: " + m101CopyOne.getMass());

        Galaxy m101CopyTwo = Galaxy.newInstance(m101);
        m101CopyTwo.setMass(35.0);
        System.out.println("M101 mass: " + m101.getMass());
        System.out.println("M101CopyTwo mass: " + m101CopyTwo.getMass());
    }
} 
30
ответ дан 29 November 2019 в 22:33
поделиться

Некоторые опции:

  • можно реализовать Cloneable для объекта и поместить clone() метод как общественность. Посмотрите полное объяснение здесь: http://www.cafeaulait.org/course/week4/46.html
    Однако это производит мелкую копию и могло бы быть не чем-то, что Вы хотите.
  • можно сериализировать и десериализовать объект. Необходимо будет реализовать Serializable интерфейс для объекта и всех его полей.
  • можно использовать XStream для выполнения сериализации через XML - Вы ничего не должны будете реализовывать здесь.
14
ответ дан 29 November 2019 в 22:33
поделиться

Joshua Bloch имеет некоторые интересные вещи сказать о cloneable. В зависимости от размера/конструкции объекта я добавил бы конструктора копии к объекту или сериализировал бы/десериализовал бы использование одного из упомянутых выше решений.

2
ответ дан 29 November 2019 в 22:33
поделиться

Для тестового кода Сериализация, возможно, самый безопасный ответ, особенно если объект уже является сериализуемым Apache попытки палата общин SerializationUtils для реализации.

9
ответ дан 29 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: