Задать вопрос

Как создать клон объекта в Java?

Нашел такое решение: stackoverflow.com/questions/869033/how-do-i-copy-a...

Оно не подошло. Не знаю как и почему, но все переменные в новом объекте становятся ссылками на переменные старого. Т.е. в нужном месте я создал копию объекта:
MyObject oldObject = new MyObject();
oldObject.someField = 1;
MyObject newObject = new MyObject(oldObject);
oldObject.someField = 2;

и переменная someField у объекта newObject тоже стала равняться 2.

Пробовал написать мегакостыль: в классе, который надо будет копировать, создал функцию clone() и присвоил в ней всем переменным значения из существующего объекта:
public Pot clone() {
        Pot newPot = new Pot();

        Field[] fields = this.getClass().getDeclaredFields();
        for (Field declaredField : fields) {
            try {
                if (declaredField.get(this) == null) {
                    newPot.setValue(declaredField.getName(), null);
                } else {
                    newPot.setValue(declaredField.getName(), declaredField.get(this));
                }
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                Logger.getLogger(PotType.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return newPot;
    }

    public boolean setValue(String key, Object value) {
        try {
            if (!key.equals("initP")) {
                Field declaredField = this.getClass().getField(key);
                declaredField.set(this, value);
            }
        } catch (IllegalArgumentException | IllegalAccessException ex) {
            Logger.getLogger(PotType.class.getName()).log(Level.SEVERE, null, ex);

            return false;
        } catch (NoSuchFieldException | SecurityException ex) {
            Logger.getLogger(PotType.class.getName()).log(Level.SEVERE, null, ex);

            return false;
        }
        return true;
    }


MyObject oldObject = new MyObject();
oldObject.someField = 1;
MyObject newObject = oldObject.clone();
oldObject.someField = 2;

И опять все тоже самое! someField в новом объекте стало равно двум. Что за чертовщина? :) Прошу помощи.
  • Вопрос задан
  • 2023 просмотра
Подписаться 1 Оценить Комментировать
Ответ пользователя Владимир Смирнов К ответам на вопрос (2)
@bobzer
Java EE Developer
У вас 2 варианта:
  1. Использовать какую-либо библиотеку для глубокого клонирования. Плюс в гораздо меньшем количестве бездумного кодинга. Минус в падении производительности и повышенном потреблении ресурсов. Если количество операций клонирования в приложении менее сотни в секунду, то можно не беспокоится по поводу производительности.
  2. Писать всё клонирование самому, поле за полем. Плюс в высокой производительности - ни одна универсальная библиотека не сравнится в скорости с таким подходом. Минус в массе говнокода, который еще и поддерживать надо (при любом изменении класса не забывать дорабатывать методы clone())
Ответ написан