Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Клонирование объектов Java

#java #ооп #классы #объекты #клонирование


В классе main есть: 
 1) класс сlass1 в котором есть двумерный массив и еще несколько переменных 
 2) функция func(class1 cl) которая принимает объект класса но возвращает другой
тип данных (float), при этом внутри тела функции проводятся манипуляции с двумерным
массивом класса что бы получить ответ

Так вот, проблема в том, что если я создам экземпляр класса, вызову функцию и передам
его туда, то после этого исходный массив объекта меняется (Что мне естественно не нужно) 
Я нашел решение в виде метода clone(), но хеш-код объектов то стал другим, а вот
хеш-код полей внутри клона объекта тот же, и соответственно при изменении массива одного
объекта изменяется массив другого 

Подскажите пожалуйста как решить эту проблему?
    


Ответы

Ответ 1



Сделайте class1 сериализуемым (добавьте implements Serializable в его определение). Сохраняем объекта класса в поток байтов: ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream ous = new ObjectOutputStream(baos); ous.writeObject(new class1()); ous.close(); теперь в func можно передать (class1)new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())).readObject() Таким образом объект класса сохраняется в поток из которого восстанавливаться независимый клон.

Ответ 2



Чтобы метод clone клонировал поля объекта, его нужно переопределить в самом классе. По умолчанию он оперирует только примитивными типами и указателями Но Вам нужно просто скопировать массив. Для этого есть метод Arrays.copyOf() или банально вызвать clone для массива Вот тут описаны разные методы получения копии массива https://stackoverflow.com/a/36513254/5376639

Комментариев нет:

Отправить комментарий