博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不可变类小结
阅读量:4497 次
发布时间:2019-06-08

本文共 1923 字,大约阅读时间需要 6 分钟。

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

 

ps.

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

 

不可变类特点

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

public final class ImmutableClass {}

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

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

public final class ImmutableClass {    private final int id;    private final String name;    private final HashMap testMap;}

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

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

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)

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;    }}

 

转载于:https://www.cnblogs.com/ydymz/p/10069874.html

你可能感兴趣的文章
python字符串连接的N种方式
查看>>
android脚步---简单图片浏览器改变图像透明度
查看>>
mysql中insert into select from的使用
查看>>
【Luogu】P2536病毒检测(Trie上DP)
查看>>
上传文件
查看>>
typeof
查看>>
@Mapper 和 @MapperScan 区别
查看>>
Unity笔记(3)自学第二天
查看>>
[NOIP2013] 华容道
查看>>
(转)java并发编程--Executor框架
查看>>
算法竞赛入门经典 2.2 循环结构程序设计
查看>>
sql server 2000/2005 判断存储过程、触发器、视图是否存在并删除
查看>>
mysql 隔离级别 脏读 测试
查看>>
Datagridview获取列名为“”的值
查看>>
Python 爬虫的工具列表 附Github代码下载链接
查看>>
IE6/7中li浮动外边距无法撑开ul的解决方法
查看>>
SOS团队介绍
查看>>
python 解析Excel
查看>>
$_SERVER
查看>>
Lambda表达式-使用说明
查看>>