关于不变模式和String,StringBuff…

来源:互联网 发布:国家的崛起人工智能 编辑:程序博客网 时间:2024/06/04 19:58

Java中有这么一个概念即ImmutableType,即不变类型。即某个类不能的状态一旦生成后就不能被改变,对应的设计模式称之为不变模式;

不变模式的实现思路是:

1 将所有的成员变量私有化,在内部进行初始化,并将该成员变量用final修饰,以防止外界用反射机制改变;

2不提供任何写方法,读方法中不能让外界获取成员的引用,而是一个成员的拷贝(如果获取到了当前对象的实例变量的引用,比如User类的user对象,你获取到了,就可以直接user.setUserName(),这样就改变了类的内部属性了,因此不安全),这样外界即使获取到了某个成员变量并对其进行改变,也是对拷贝的改变,并没有改变成员的状态;

根据这一思路不变模式又分为强不变模式和弱不变模式;

这是相对于子类来说,一个弱不变模式是保证本类状态不被改变,但是子类继承后,子类的状态可以改变;

而强不变模式是即保证本类对象不变,也保证子类的状态不变;

实现的思路:

1 将本类用final修饰,那么他就不能有子类;

2 将本类的所有方法用final修饰符修饰;那么子类就不能覆盖父类的方法以改变父类的状态;

String类就是一个强不变模式的典型代表,我们每次对一个字符串进行改变操作其实都是对这个对象的拷贝进行的操作,因为我们获取不到这个对象的引用。

因此不变模式的类是一个线程安全的类;

顺带提一下如果我们要使用字符串进行连接操作,即将几个字符串对象用+连接起来时,使用StringBuffer或者StringBuilder的append方法

然后在toString,因为我们直接用+连接会产生很多的中间对象以及该对象的拷贝,给gc带来压力。

具体的请参看我的另外一篇日志:http://rongqiang1992.blog.163.com/blog/static/21727620920134884022130/

关于不变模式和String,StringBuffer、StringBuilder的理解转发至微博
 
关于不变模式和String,StringBuffer、StringBuilder的理解转发至微博
0 0