clonen und transient

takidoso

Erfahrenes Mitglied
Hallo und Halli,
habe neulich code gesehen, in dem das Objekt einer clonable Klasse lediglich mit super.clone() implementiert war.
Member der Klasse Image waren in ihrer Deklaration mit transient bestückt.
Nun hatte ich eigentlich es so verstanden, dass der Autor der besagten Klasse vermutlich alles tief klonen wollte mit Ausnahme der Bilddaten.
Andererseits habe ich bisher nur den Sinn des Schlüsselwortes transient so verstanden, dass bei der Objekt-Serialiierung eben solche markierten Member nicht mit serialisiert werden. Trifft das dann tatsächlich auch auf ein Klonen zu, dass als transient markierte Member nicht tief mitgeklont werden, allenfalls die Referenz des Members, oder war das nur Annahme/Wunschdenken des Autors?

mit fragenden Grüßen

Takidoso
 
Zuletzt bearbeitet:
Habe mal dazu ein kleines Testprogramm gebastelt.
offenbar wird nicht tief geklont hatte da wohl was falsches im Sinn gehabt:
Java:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;



public class DeepCloneTransientTest implements Cloneable
{
	private           int[]         buffer  = null;
	transient private int[]         bufferT = null;
	private           BufferedImage img     = null;
	transient private BufferedImage imgT    = null;
	
	public DeepCloneTransientTest()
	{
		
	}

	public DeepCloneTransientTest clone()
	{
		try
		{
			return (DeepCloneTransientTest) super.clone();
		}
		catch (CloneNotSupportedException e)
		{
			e.printStackTrace();
			return null;
		}
	}
	
	
	

	
	/**
	 * @return the buffer
	 */
	public int[] getBuffer()
	{
		return buffer;
	}


	
	/**
	 * @param buffer the buffer to set
	 */
	public void setBuffer(int[] buffer)
	{
		this.buffer = buffer;
	}


	
	/**
	 * @return the bufferT
	 */
	public int[] getBufferT()
	{
		return bufferT;
	}


	
	/**
	 * @param bufferT the bufferT to set
	 */
	public void setBufferT(int[] bufferT)
	{
		this.bufferT = bufferT;
	}
	
	
	public String toString()
	{
		return super.toString()+"\n"+
		       buffer+"\n"+
		       bufferT+"\n"+
		       img+"\n"+
		       imgT+"\n";
	}
	


	
	/**
	 * @return the img
	 */
	public BufferedImage getImg()
	{
		return img;
	}

	
	/**
	 * @param img the img to set
	 */
	public void setImg(BufferedImage img)
	{
		this.img = img;
	}

	
	/**
	 * @return the imgT
	 */
	public BufferedImage getImgT()
	{
		return imgT;
	}

	
	/**
	 * @param imgT the imgT to set
	 */
	public void setImgT(BufferedImage imgT)
	{
		this.imgT = imgT;
	}
	
	
	static public void main(String args[]) throws IOException 
	{
		DeepCloneTransientTest test = new DeepCloneTransientTest();
		
		test.setBuffer(new int[] {1,2,3,4,5,6,7,8,9});
		test.setBufferT(new int[] {1,2,3,4,5,6,7,8,9,10,11,12});
		test.setImg(ImageIO.read(new File("bild1.gif")));
		test.setImgT(ImageIO.read(new File("bild2.bmp")));
		System.out.println("test    ="+test.toString());
		
		DeepCloneTransientTest testClone = test.clone();
		System.out.println("testClone="+testClone.toString());
	}
}

Ausgabe:
Code:
test    =DeepCloneTransientTest@1dfafd1
[I@8fce95
[I@143c8b3
BufferedImage@12d7a10: type = 13 IndexColorModel: #pixelBits = 8 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@a8c488 transparency = 2 transIndex   = 127 has alpha = true isAlphaPre = false ByteInterleavedRaster: width = 100 height = 100 #numDataElements 1 dataOff[0] = 0
BufferedImage@1feca64: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@a8c488 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 89 height = 89 #numDataElements 3 dataOff[0] = 2

testClone=DeepCloneTransientTest@998b08
[I@8fce95
[I@143c8b3
BufferedImage@12d7a10: type = 13 IndexColorModel: #pixelBits = 8 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@a8c488 transparency = 2 transIndex   = 127 has alpha = true isAlphaPre = false ByteInterleavedRaster: width = 100 height = 100 #numDataElements 1 dataOff[0] = 0
BufferedImage@1feca64: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@a8c488 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 89 height = 89 #numDataElements 3 dataOff[0] = 2

Fazit: es macht keinen Unterschied auf das Klonen und das Klonen findet bei Objekten offenbar grundsätzlich by referenz statt, ansonsten hätte ich hier unterschiedliche Hash-Codes der Objekte zwischen Original und Clone erwartet.
 

Neue Beiträge

Zurück