22 октября, 2008
Случается в жизни Java программиста так, что требуется клонировать объект, который не является Cloneable и соответственно вызвать Object.clone() не представляется возможным.
Ниже привожу простой способ клонирования объекта.
public YourObject cloneObject(YourObject sourceObj) {
try {
ByteArrayOutputStream baostream
= new ByteArrayOutputStream();
ObjectOutputStream oostream
= new ObjectOutputStream(baostream);
oostream.writeObject(sourceObj);
oostream.flush();
oostream.close();
ByteArrayInputStream baistream
= new ByteArrayInputStream(baostream.toByteArray());
ObjectInputStream oistream
= new ObjectInputStream(baistream);
YourObject copy = (YourObject)oistream.readObject();
oistream.close();
return copy;
} catch(Exception e) {
}
}
Это все, конечно, интересно…только вот иногда я задумываюсь совсем о другом, например, о смысле жизни и т.д. любите свою жизнь и тогда жить станет гораздо веселее…
Пример умалчивает о том, что :
- для такого “простого способа клонирования объекта” нужно чтобы этот объект был java.io.Serializable.
- без дополнительных усилий получится только “shallow copy” объекта.
package eg;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.junit.Test;
public class JavaCoreTest extends TestCase {
@Test
public void testClone_WithoutCloneabl() throws Exception {
List tags = new ArrayList(2);
Tag j2ee = new Tag(”j2ee”);
tags.add(j2ee);
Tag bydlo = new Tag(”bydlo”);
tags.add(bydlo);
Stuff myStuff = new Stuff(”myWay”, 1, tags);
Stuff clone = (Stuff) CloneFactory.clone(myStuff);
assertNotNull(clone);
assertNotSame(clone, myStuff);
assertEquals(”myWay”, clone.getString());
assertEquals(1, clone.getPrimitive());
assertEquals(2, clone.getTags().size());
assertNotSame(j2ee, tags.get(0));
assertNotSame(bydlo, tags.get(1));
}
private static class CloneFactory {
static Object clone(Object sourceObj) throws IOException,
ClassNotFoundException {
ByteArrayOutputStream baostream = new ByteArrayOutputStream();
ObjectOutputStream oostream = new ObjectOutputStream(baostream);
oostream.writeObject(sourceObj);
oostream.flush();
oostream.close();
ByteArrayInputStream baistream = new ByteArrayInputStream(baostream
.toByteArray());
ObjectInputStream oistream = new ObjectInputStream(baistream);
Object copy = oistream.readObject();
oistream.close();
return copy;
}
}
private static class Stuff implements Serializable {
private String string = “”;
private int primitive;
private List tags = new ArrayList();
public Stuff(String string, int primitive, List tags) {
this.string = string;
this.primitive = primitive;
this.tags = tags;
}
public String getString() {
return string;
}
public int getPrimitive() {
return primitive;
}
public List getTags() {
return tags;
}
}
static class Tag implements Serializable {
private String name = “”;
public Tag(String name) {
this.name = name;
}
String getName() {
return name;
}
}
}
Всё-таки если нужен быстрый код, наверно надо использовать C а не Java. Хотя слыхал, что вроде как теперь Java стала пошустрей
Да . Я гдето читал что Java уже не тот что был раньше
Иван, в том то и дело, что наоборот, Java сокращает расстояние, но оно всё ещё не маленькое
С Новым годом и наступающим Рождеством !