Kopie eines Object's erzeugen ?

vrcat

Mitglied
Hallo,

ich bin in der Situation das ich die Instanz eines Objektes bekomme und ich soll dieses Objekt noch mal erzeugen es muss keine direkte Kopie sein sondern nur eine neu erzeugte Instanz dieser Klasse wie kann ich das am besten bewerkstelligen?
 
Hallo,

danke erstmal für die Links sind sehr interessant. Aber ich glaube ich habe mich falsch ausgedrückt.

Es ist eher so das ich eine Instanz einer Klasse (Object) bekomme und nun will ich gerne die Klasse noch mal neu erzeugen. Also so als würde ich wissen welche Klasse das ist und mache einfach new Klasse(), aber da es sich dabei um verschiedenste Klassen handelt kann man das nicht pauschalisieren.
 
Wenn du ein Objekt bekommst was du dann neu erzeugen willst kannst du ja mit instanceOf überprüfen von welcher Klasse diese Objekt ist vieleicht bringt dich das irgendwie weiter. Wüsste halt nicht wie man dann dynamisch damit eine neues Instanz der Klasse machen kann wenn es dynamisch ist.
Gruß Steff
 
Hallo!

Beispiel:
Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class A {

	private String data;

	private int someMagicValue;

	/**
	 * default Constructor
	 */
	public A() {}

	public A(String data, int someMagicValue) {
		this.data = data;
		this.someMagicValue = someMagicValue;
	}

	/**
	 * copy Constructor
	 * 
	 * @param a
	 */
	public A(A a) {
		this.data = a.data;
		this.someMagicValue = a.someMagicValue;
	}

	public String getData() { return data; }

	public void setData(String data) { this.data = data; }

	public int getSomeMagicValue() { return someMagicValue; }

	public void setSomeMagicValue(int someMagicValue) {
		this.someMagicValue = someMagicValue;
	}
}

Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class B {

	private String data;

	private int someMagicValue;

	/**
	 * default Construtor
	 */
	public B() {}
	
	public B(String data, int someMagicValue) {
		this.data = data;
		this.someMagicValue = someMagicValue;
	}

	/**
	 * copy Constructor
	 * @param b
	 */
	public B(B b) {
		this.data = b.data;
		this.someMagicValue = b.someMagicValue;
	}

	public String getData() { return data; }

	public void setData(String data) { this.data = data; }

	public int getSomeMagicValue() { return someMagicValue;	}

	public void setSomeMagicValue(int someMagicValue) {
		this.someMagicValue = someMagicValue;
	}
}

Wenn die Klassen unbekannt sind und du jedoch vereinabren könntest, dass alle Klassen deren Instanzen durch diese Methode kopiert werden sollen wie (A und B) einen Copy Constructor definieren müssen kannst du folgendes machen:
Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class DynamicInstanceCopyExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {

		for (int i = 0; i < 10; i++) {
			int rnd = (int) (Math.random() * 10);

			Object o = null;

			if (rnd > 4) {
				o = new A("" + System.currentTimeMillis(), i);
			} else {
				o = new B("" + System.currentTimeMillis(), i);
			}

			Object newInstanceOfO = copyObject(o);
			System.out.println("Copy result " + o);
		}
	}

	private static Object copyObject(Object o) throws Exception {
		Class clazz = o.getClass();
		return clazz.getDeclaredConstructor(new Class[] { clazz }).newInstance(
				new Object[] { o });
	}
}

Falls die Klassen genau feststehen würde sich sowas anbieten:
Code:
	private static Object copyObject(Object o) throws Exception {
		Class clazz = o.getClass();

		if (A.class.equals(clazz)) {
			A a = new A((A) o);
			return a;
		} else if (B.class.equals(clazz)) {
			B b = new B((B) o);
			return b;
		}
		
		//Oder if (o instanceof A) { return new A( (A) o); } ... 

		return null;
	}

Gruß Tom
 
Hallo Thomas,

naklar ne copy Funktion in die Klasse einbauen! :-) naja da hätte ich auch drauf kommen können aber manchmal sieht man den Wald vor lauter Bäumen nicht.

Tausend DANK.
 
Zurück