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) {
        }
    }

Комментариев (6) к записи «Простое клонирование не Cloneable объектов»: 

  1. 1 Жизнерадостная

    Это все, конечно, интересно…только вот иногда я задумываюсь совсем о другом, например, о смысле жизни и т.д. любите свою жизнь и тогда жить станет гораздо веселее…

  2. 2 j2ee_bydlo_developer

    Пример умалчивает о том, что :

    - для такого “простого способа клонирования объекта” нужно чтобы этот объект был 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;
    }
    }
    }

  3. 3 cms

    Всё-таки если нужен быстрый код, наверно надо использовать C а не Java. Хотя слыхал, что вроде как теперь Java стала пошустрей

  4. 4 Иван

    Да . Я гдето читал что Java уже не тот что был раньше

  5. 5 cms

    Иван, в том то и дело, что наоборот, Java сокращает расстояние, но оно всё ещё не маленькое

  6. 6 Герман

    С Новым годом и наступающим Рождеством !

Оставить комментарий