前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不可变类小结

不可变类小结

作者头像
ydymz
发布2018-12-24 11:14:08
2850
发布2018-12-24 11:14:08
举报
文章被收录于专栏:lgp20151222lgp20151222

同样是面试遇到的问题,基本想到的final和private之类的都考虑到了,就是没想到深复制和get方法得到副本这些重点

ps.

String类就是个不可变类,它的对象一旦创建之后,值就不能被改变了。写这篇的时候看了一遍源码,有时间了自己看下吧,写个String类的分析太长了,,,

不可变类特点 1将类声明为final,所以它不能被继承

代码语言:javascript
复制
public final class ImmutableClass {
}

2将所有的成员声明为私有的,这样就不允许直接访问这些成员

3将所有的成员声明为final,这样只能对它们赋值一次

代码语言:javascript
复制
public final class ImmutableClass {

    private final int id;

    private final String name;

    private final HashMap testMap;
}

4对变量不要提供setter方法,这样就不允许直接修改这些成员

5在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

代码语言:javascript
复制
public final class ImmutableClass {

    private final int id;

    private final String name;

    private final HashMap testMap;
    /**
     * id 是基础类
     */
    public int getId() {
        return id;
    }

    /**
     * String 是不可变类直接返回
     */
    public String getName() {
        return name;
    }

    /**
     * 可变对象的返回方法
     */
    public HashMap getTestMap() {
        //return testMap;
        return (HashMap) testMap.clone();
    }
}

6通过构造器初始化所有成员,进行深拷贝(deep copy)

代码语言:javascript
复制
public final class ImmutableClass {

    private final int id;

    private final String name;

    private final HashMap testMap;
    /**
     * id 是基础类
     */
    public int getId() {
        return id;
    }

    /**
     * String 是不可变类直接返回
     */
    public String getName() {
        return name;
    }

    /**
     * 可变对象的返回方法
     */
    public HashMap getTestMap() {
        //return testMap;
        return (HashMap) testMap.clone();
    }

    /**
     * 实现深拷贝(deep copy)的构造器
     *
     * @param i
     * @param n
     * @param hm
     */
    public ImmutableClass(int i, String n, HashMap hm) {
        System.out.println("Performing Deep Copy for Object initialization");
        this.id = i;
        this.name = n;
        HashMap tempMap = new HashMap();
        String key;
        Iterator it = hm.keySet().iterator();
        while (it.hasNext()) {
            key = (String) it.next();
            tempMap.put(key, hm.get(key));
        }
        this.testMap = tempMap;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档