2016-01-31 3 views
0

Обычно, когда у меня есть объекты с глубокой копией, я использую конструктор копирования. Для нашего задания мы должны сделать ObjectList, хотя инструктор отметил, что такой список нецелесообразно использовать. В любом случае, я столкнулся с проблемой, когда добавляю новый объект в массив. Я пытаюсь создать глубокую копию объекта, прежде чем добавлять его в массив, чтобы предотвратить утечку конфиденциальности, но нет конструктора копирования для класса Object. Например, следующее не работает:Как глубоко скопировать объект типа Object?

Object temp = new Object(insertObjectArgument); 

Затем я посмотрел в Object.clone(), но похоже, что я должен остаться как далеко от того, насколько это возможно. Есть ли способ, которым я могу глубоко скопировать объект типа Object?

ответ

0

У Java нет «магической» утилиты для глубокого копирования. Если объекты, о которых вы беспокоитесь, относятся к классам, которые выбрали поддержку clone(), вы можете использовать клон. Однако, не читая весь код, невозможно быть уверенным, что реализации методов клонирования будут соответствовать вашим требованиям безопасности. В противном случае вам нужно сделать это сложным способом, построив новый граф объектов из старого.

+0

Итак, рассказывая нам о создании списка объектов, мой инструктор в основном сделал невозможным предотвращение утечки конфиденциальной информации, учитывая, что любой объект может быть добавлен в мой массив? Невозможно определить, поддерживает ли какой-либо данный объект моей функции вставки функции clone(), правильно? – shtuken

+0

Если у вас есть класс, убедитесь, что он не переопределяет метод 'clone()', часто люди переопределяют метод клонирования, чтобы не допустить глубоких копий своего объекта. –

0

Вам нужно сделать метод под названием clone и переопределить его для типичного метода clone(), который поставляется с классом Object с использованием @Override. После этого создайте новый объект и скопируйте данные из старого объекта в него. Когда я помещаю /..., это означает, что можно добавить больше кода или вы можете удалить код, который я изначально поставил.

/** 
* Explanation for http://stackoverflow.com/questions/35120424/how-to-deep-copy-an-object-of-type-object 
* 
* @author Riley C 
* @version 1/31/16 
*/ 
public class ObjectToReturn 
{ 
    //variables 
    int x; 
    int y; 
    // ... 

    //constructor 
    public ObjectToReturn() 
    { 
     x = 0; 
     y = 0; 
     // ... 
    } 

    //overrides 
    @Override 
    public ObjectToReturn clone() 
    { 
     ObjectToReturn returnMe = new ObjectToReturn(); 
     returnMe.setX(this.x); 
     returnMe.setY(this.y); 
     // ... 
     return returnMe; 
    } 

    //methods 
    public void setX(int x) {this.x = x;} 
    public void setY(int y) {this.y = y;} 
    // ... 

    public int getX() {return x;} 
    public int getY() {return y;} 
    // ... 
} 

Почему вы не должны использовать клон

по умолчанию Из того, что я помню, в то время как clone() иногда может генерировать глубокую копию объекта, не всегда это делать.

Привычки, чтобы попасть в

Хорошие привычки мой инструктор колледжа сказал, что его компания нравилось видеть, если убедившись, что вы делаете глубокие копии массивов и объектов, а также переопределение equals, clone и toString метод, который обычно идут с классом Object. Это позволит вам использовать эти методы на своих объектах так, как вы хотели бы, чтобы они работали, вместо значений по умолчанию, которые могут дать ответы, которые не имеют смысла. Он также часто становится более чистым и подвержен ошибкам.

+0

В моем вопросе говорится, что я рассматриваю экземпляры объектов типа объекта копирования.Ваш метод overridden clone() требует, чтобы я знал, какие типы данных хранятся в любом объекте, который передается мне, что невозможно узнать. – shtuken

+0

Я говорю, что нередко времена объекты будут иметь переопределенный 'clone()', который делает глубокую копию в своем классе. Если это не так, они, вероятно, не хотят, чтобы вы сделали копию этого по какой-то причине. Если ваш учитель сказал, что список объектов не подходит для использования, возможно, это потому, что он * хочет * использовать метод 'clone()' класса Object и понимать, почему вы должны делать ваши классы конкретными, а не общие (ООП). –

1

Для сложных объектов и при невысокой производительности я использую библиотеку json, например gson , чтобы сериализовать объект в json-тексте, затем десериализуем текст, чтобы получить новый объект.

gson, который основан на отражении, будет работать в большинстве случаев, за исключением того, что поля transient не будут скопированы и объекты с круговой ссылкой с причиной StackOverflow exception.

public static <ObjectType> ObjectType Copy(ObjectType AnObject, Class<ObjectType> ClassInfo) 
{ 
    Gson gson = new GsonBuilder().create(); 
    String text = gson.toJson(AnObject); 
    ObjectType newObject = gson.fromJson(text, ClassInfo); 
    return newObject; 
} 
public static void main(String[] args) 
{ 
    MyObject anObject ... 
    MyObject copyObject = Copy(o, MyObject.class); 

} 
Смежные вопросы