clone()

Kassel

Aktives Mitglied
Hi Community,

habe ein Problem bei einem JUnit Test .. immer rot:

TEST:
Java:
@Test
	public void testMessageSimpleClone()
	{
		Message m = new Message();
		m.setFrom("Alice");
		m.setTo("Bob");
		m.setContent("Hallo, wie gehts?");
		
		Message copy = (Message) m.clone();
		
	
		assertNotNull(copy);
		assertEquals(m, copy); -> FEHLER
		assertNotSame(m, copy);
		
		assertEquals(m.getFrom(), copy.getFrom());
		assertEquals(m.getTo(), copy.getTo());
		assertEquals(m.getContent(), copy.getContent());
	}

MESSAGE:
Java:
public class Message implements Cloneable
{

	private String from;
	private String to;
	private String content;
	
	private Message message;
	
	private Collection<Attachment> attachments = new HashSet<Attachment>();
....
getter setter ...

public Object clone(){
//		try{
//		Message cloned=(Message)super.clone();
//		cloned.content=getContent();
//		cloned.from=getFrom();
//		cloned.to=getTo();
//		return cloned;
//		}
//		catch(CloneNotSupportedException e){
//			  System.out.println(e);
//			  return null;
//			  }
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

Was ist bei meiner clone zu beachten damit mein Test nicht fehlschlägt ?
 

faetzminator

Gesperrter Benutzer
Du musst [c]clone()[/c] selbst implementieren. Zuerst ein neues Objekt erzeugen und dann alle nicht primitiven, mutable Felder mit [c]clone()[/c] rüberkopieren. Die primitiven (int, ...) und immutable Felder (String, ...) können einfach rüberkopiert werden.
 

Kassel

Aktives Mitglied
Du meinst so was ?

Java:
public Message clone(){
                      Message cloned=(Message)super.clone();
		cloned.content=getContent();
		cloned.from=getFrom();
		cloned.to=getTo();
		return cloned;
}

Dies klappt jedoch nicht ...
 

faetzminator

Gesperrter Benutzer
Nein eben nicht [c]super.clone()[/c] sondern [c]new Message()[/c]. Oder was verstehst du sonst unter Zuerst ein neues Objekt erzeugen ;) ?
 

Kassel

Aktives Mitglied
Sry ... stimmt so - jedoch ist mein Test immer noch nciht grün da hier ein Fehler auftritt:

Java:
assertEquals(m, copy);

Jetzt frage ich mich warum dass so ist ... alle Attribute des einen Objektes stimmen mit den Attributen des anderen Objektes überein ... komisch
 
S

SlaterB

Gast
clone ist super, egal in welcher Form, aber überlege mal auf welche Weise assertEquals(m, copy); die Gleichheit feststellt,
ergeben die Buchstaben e, q, u, a, l, s in irgendeiner Kombination etwas was du kennst? ;)

@faetzminator
super.clone() geht! zumindest technisch, ob so gedacht ist eine andere Frage

> dann alle nicht primitiven, mutable Felder mit clone() rüberkopieren.
warum nicht dieselben nehmen? ob so oder so kann man ganz nach belieben entscheiden, beides macht Sinn
 
Zuletzt bearbeitet von einem Moderator:

Kassel

Aktives Mitglied
Danke Community,

jetzt habe ich es auch kapiert ... wie schon SlaterB sagte ... mit
Java:
super.clone();
geht es auch ...
ich musste halt sicherstellen dass:

Java:
assertEquals(m, copy);
assertNotSame(m, copy);

zwei Objekte gleich sind und identisch ( equals ), jedoch nicht die selben Objekte sind also kein
Java:
Object obj1=obj2;
...
dies hat natürlich geklappt indem ich den Rat von njans befolgt habe in dem ich die equals Methode überschrieben habe - z.B so :

Java:
public boolean equals( Object obj )
	{
		boolean flag = false;
		Message emp = ( Message )obj;
		if( emp.from == getFrom() )
			flag = true;
		return flag;
	}

Jetzt fuktioniert es auch ... Danke
 

faetzminator

Gesperrter Benutzer
Hab nochmal in der Javadoc gelesen - und ich muss dir hier wohl recht geben! Allerdings erstellt es keine Deep Copy - was wohl der Grund dafür ist, dass ich das nicht kannte. Ich hab bis jetzt immer nur Deep Copy benötigt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Compiler-Fehler SupressWarning für clone() Java Basics - Anfänger-Themen 6
S Copy - Constructor vs clone() Java Basics - Anfänger-Themen 20
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
F Methoden Object.clone() Java Basics - Anfänger-Themen 1
B Klasse: Methode Clone Java Basics - Anfänger-Themen 5
Q Methode clone() bei Vererbung Java Basics - Anfänger-Themen 5
U "Clone" Fragen Java Basics - Anfänger-Themen 3
Luk10 Arrays.copy(myArray) vs myArray.clone() Java Basics - Anfänger-Themen 9
H Interface clone-Methode in Interface Java Basics - Anfänger-Themen 6
A Shallow copy .super.clone() Java Basics - Anfänger-Themen 2
B Deep Clone Java Basics - Anfänger-Themen 12
D probs mit clone und equals Java Basics - Anfänger-Themen 10
B clone() und casts umschreiben Java Basics - Anfänger-Themen 4
S Eigenes Objekt temporär verändern? (Clone)? Java Basics - Anfänger-Themen 12
T Deep Clone Java Basics - Anfänger-Themen 3
I clone() und Referenzen Java Basics - Anfänger-Themen 25
E Vector und clone() Java Basics - Anfänger-Themen 6
M Brauch ich dazu clone()? Java Basics - Anfänger-Themen 5
C Frage zu clone() Java Basics - Anfänger-Themen 2
B clone(), Clonable und Felder von Interfacetypen Java Basics - Anfänger-Themen 3
G Frage zu clone() Java Basics - Anfänger-Themen 6
G Problem clone und Vektor Java Basics - Anfänger-Themen 4
P Clone Methode treibt mich zum Wahnsinn Java Basics - Anfänger-Themen 10
M Arrays clonen mit clone() scheint nicht zu funktionieren Java Basics - Anfänger-Themen 4
S JPanel mit clone() duplizieren Java Basics - Anfänger-Themen 4
S Objekt klonen mit clone() Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben