Дублирование экземпляра Java и сохранение в первом экземпляре, как скопировать значения из второго экземпляра обратно в первый? - PullRequest
0 голосов
/ 08 июня 2011
public class Example {
    public Example duplicate;

    public void duplicateState() {
        this.example = this.clone();
    }

    public void loadDuplicate() {
        // implementation
    }
}

Глядя на приведенный выше пример, вы видите, что мне нужно продублировать экземпляр Example. Это делается для того, чтобы объекты, которые хотят изменить Пример, вместо этого должны модифицировать дубликат, позволяя основному экземпляру запускать подпрограммы без изменения критических переменных. Периодически Пример загружает значения дубликата и может выполнять подпрограммы с обновленными переменными. Производительность имеет решающее значение в этом. Кто-нибудь знает, как максимально быстро реализовать функцию loadDuplicate, или есть другие способы решения этой проблемы?

Ответы [ 4 ]

3 голосов
/ 08 июня 2011

Используйте функцию сериализации в Java, а затем десериализовайте ее.

Подробнее см. в этой статье

1 голос
/ 08 июня 2011

ЭТО НЕ ОТВЕТ, НО КОММЕНТАРИЙ

, если вы используете clone () и выполняете все задания самостоятельно (как в приведенном ниже ответе, что на самом деле правильно), от обслуживанияВ перспективе, имейте в виду, что если вы / кто-то еще добавите новые поля в класс Example (скажем, через несколько месяцев), вам может потребоваться соответственно обновить метод mimic (), который может быть легко пропущен.Так что, если вы не заметите реальных проблем с производительностью (которые, я уверен, вы не заметите), лучше придерживаться встроенной сериализации ... только мои 2 цента .. (я знаю, что у вас все в порядке с мелкой копией, все же ..)

ps не может комментировать, так как я новый пользователь SO

0 голосов
/ 08 июня 2011

Если вам действительно нужна самая быстрая производительность, то и duplicateState(), и loadDuplicate() должны состоять из последовательности присвоений полей Example.

И клонирование, и сериализация будут значительно медленнее, хотя «сколько» будет зависеть от количества полей и их типов.

Другой вопрос, нужно ли вам делать глубокую или поверхностную копию состояния Example. Клонирование (использование метода clone() по умолчанию даст вам поверхностную копию, а сериализация даст вам (рекурсивно) глубокую копию.

(FWIW - последний пункт является причиной того, что сериализация будет медленнее, чем клонирование. Другое - то, что сериализация также должна включать метаданные в последовательной форме ... и это больше данных для копирования.)

0 голосов
/ 08 июня 2011

Прежде всего, я не думаю, что это будет быстрее или лучше, чем сериализация в байтовый массив (или некоторая другая структура в памяти) и десериализация, но если вы настаиваете на «сохранении» состоянияс клоном, просто реализуйте метод, который противоположен вашему clone() методу:

public class Example {
    public Example example;
    private Content content;
    //... more fields

    public void saveState() {
        this.example = this.clone();
    }

    public void loadState() {
        mimic( example );
    }

    public Example clone() {
        Example clone = new Example();
        clone.content = this.content;
        clone.example = this.example;
        //... you're doing this with all your fields I presume
        return clone;
    }

    public void mimic( Example model ) {
        this.content = model.content;
        this.example = model.example;
        //... and so on.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...