2010-12-28 2 views
1

У меня есть список с объектами класса говорятвыделение памяти для объекта класса

List a[10]; 

class Hello extends abc implement xyz 
{ 
String mesg1; 
String mesg2; 
Object c; 
Goodbye d; 
// also their getter setters 
} 

а [5] содержат объекты класса Hello

Я должен скопировать экземпляр объекта на постион 1, то сделать некоторые изменения в mesg1 и mesg2 и вставлять их в один и тот же список в конце. Я пытаюсь это сделать, но поскольку мы знаем его единственную ссылку, которая хранится там, поэтому я заканчиваю тем, что изменяю mesg1 и mesg2 в позиции 1 тоже.

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

+0

Если вы используете clone(), разве вы не думаете, что он должен быть реализован? – Lukasz

ответ

7

Вам необходимо предоставить свой собственный clone или конструктор копирования как часть класса Hello.

E.g. (clone):

public Hello clone() { 
    Hello h; 

    h = new Hello(); 
    h.mesg1 = this.mesg1; 
    h.mesg2 = this.mesg2; 
    h.c = this.c; // Or a deep copy if appropriate 
    h.d = this.d; // Or a deep copy if appropriate 

    return h; 
} 

или (конструктор копирования):

public Hello(Hello original) { 
    this.mesg1 = original.mesg1; 
    this.mesg2 = original.mesg2; 
    this.c = original.c; // Or a deep copy if appropriate 
    this.d = original.d; // Or a deep copy if appropriate 
} 

Затем используйте его

a[5] = new Hello(); 
// set its members 
a[1] = a[5].clone(); // or = new Hello(a[5]); 
// set its members 
1

Так что вы хотите клонировать/дублировать существующий объект, и изменить дубликат, без изменения кода Hello.class?

Если вы можете создать новый экземпляр класса Hello с помощью одного из его конструкторов, это было бы самым простым решением. Некоторые структуры данных имеют так называемые конструкторы копирования, например, так:

Hello original = new Hello(); 
Hello duplicate = new Hello(original); 

Если класс не имеет такой конструктор, вы можете попробовать создать новый экземпляр с помощью отражения. Есть некоторые библиотеки, которые могут клонировать объекты и или копировать их свойства от одного объекта к другому, например:

Hello duplicate = BeanUtils.instantiate(original.getClass()); 
org.springframework.beans.BeanUtils.copyProperties(original, duplicate); 

Или еще проще, метод полезности достоянию-лана:

Hello duplicate = org.apache.commons.lang.SerializationUtils.clone(original); 
0

Вы можете написать метод клонирование- для Hello класса, если объект не является слишком большим, как это:

static Hello cloneHello(Hello h){ 
    Hello newHello = new Hello(); 
    //for primitive and immutable types 
    newHello.setMsg1(h.getMsg1()); 
    newHello.setMsg1(h.getMsg2()); 

    //for mutable objects you can provide cloneMyObject(MyObject o) for each type 
    newHello.setMyObject(cloneMyObject(h.getMyObject())); 

    //and so on .. 

    return newHello; 
} 

Это может стать утомительным, но должны сделать трюк.

Если вы не можете создать новый экземпляр Hello, вам придется использовать сериализацию, как предложено другими.

+0

Да Ребята, спасибо за ответ. Я использовал экземпляр Constructor, и он отлично работает. – Neeraj

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