国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

java中的clone

2019-11-15 00:33:07
字體:
供稿:網(wǎng)友
java中的clone1.先說一句

不去覆蓋clone方法,不去調(diào)用clone方法,除非真的有必要。

2.java中clone兩個概念淺克隆 copy的是引用深克隆 copy的是實例,開辟新的堆空間java中的clone方法實現(xiàn)的是淺克隆,一個類可被淺克隆需實現(xiàn)Cloneable(此接口只是說明此類允許clone,它改變的是超類中受保護的clone方法的行為),如effective java中的第11條所說這是接口的一種極端非典型的用法,不值得效仿。3.淺克隆淺克隆看上去只要實現(xiàn)了Cloneable接口 且@Override clone方法為public后就可以了,但是實際應(yīng)用了,確定你要的是淺clone么?若是一個對象沒有實現(xiàn)Cloneable接口,也可以很簡單的使用反射實現(xiàn)對象的淺復(fù)制:非嚴(yán)謹(jǐn)?shù)腸ode如下:
    public static <T> T simpleClone(T obj) throws IllegalaccessException, InstantiationException {        Class<T> c = (Class<T>) obj.getClass();        T cloneC = c.newInstance();        Field[] fields = c.getDeclaredFields();        if (fields != null && fields.length > 0) {            for (Field field : fields) {                field.setAccessible(true);                Object value = field.get(obj);                field.set(cloneC, value);            }        }        return cloneC;    }

當(dāng)然有很多工具類了:比如,sPRing的BeanUtils.copyProperties, apache的BeanUtils.copyProperties,cglib或者spring-cglib的BeanCopier

4.深克隆既然實際應(yīng)用中更希望使用的是深克隆,那么如何實現(xiàn)呢
  • bean 自己實現(xiàn)Cloneable接口,靠譜的實現(xiàn)clone方法
非嚴(yán)謹(jǐn)code如下:
public class TestCloneBean implements Cloneable {       private List<Integer> integers;     public List<Integer> getIntegers() {        return integers;    }     public void setIntegers(List<Integer> integers) {        this.integers = integers;    }     @Override    public TestCloneBean clone() {        try {            TestCloneBean t = (TestCloneBean) super.clone();            t.setIntegers(Lists.<Integer> newArrayList());            if (CollectionUtils.isNotEmpty(integers)) {                for (Integer i : integers) {                    t.getIntegers().add(i);                }            }            return t;         } catch (CloneNotSupportedException e) {            throw new RuntimeException(e);        }    }     @Override    public String toString() {        return ToStringBuilder.reflectionToString(this);    }}

  • 第一種方法你會這么做么?不會。那么只能另外一種方式:序列化啊!
非嚴(yán)謹(jǐn)code如下:
public class JsonUtils {    private static ObjectMapper objectMapper = new ObjectMapper();     static {        objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);        objectMapper.configure(JsonParser.Feature.INTERN_FIELD_NAMES, true);        objectMapper.configure(JsonParser.Feature.CANONICALIZE_FIELD_NAMES, true);        objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);        objectMapper.setSerializationInclusion(Inclusion.NON_NULL);    }     public static ObjectMapper getObjectMapperInstance() {        return objectMapper;    } } 

testCode如下:
        TestCloneBean b = new TestCloneBean();        b.setIntegers(Lists.newArrayList(1));        String s = JsonUtils.getObjectMapperInstance().writeValueAsString(b);        TestCloneBean a = JsonUtils.getObjectMapperInstance().readValue(s, TestCloneBean.class);


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 垫江县| 东辽县| 原阳县| 温宿县| 依兰县| 福贡县| 许昌县| 车致| 从江县| 乐业县| 迁安市| 百色市| 中方县| 汶上县| 县级市| 敖汉旗| 武安市| 大港区| 清涧县| 内江市| 兴隆县| 南康市| 屏东县| 永仁县| 依安县| 阳山县| 江山市| 曲周县| 哈巴河县| 武平县| 松滋市| 遵义市| 武定县| 南投县| 黄龙县| 酉阳| 鹰潭市| 偃师市| 平凉市| 灵石县| 绥中县|