Immutable pattern【坚不可摧模式】
一:immutable pattern的参与者
--->immutable(不变的)参与者
1.1:immutable参与者是一个字段的值都无法更改的类。
1.2:immutable也没有任何用来更改字段值的方法。
1.3:immutable参与者方法不需要设置synchronized
二:immutable pattern模式什么时候使用
--->当实例产生后,状态不再变化时
2.1实例状态不再变化是首要条件。
2.2何为不可变状态。就是实例的值不会发生变化。
--->实例需要共享,而且访问频繁时
--->String 类是immutable类不需要synchronized保护
StringBuffer类是非immutable类需要synchronized保护
三:immutable pattern思考
--->final关键字
2.1:final类:当生命final类,该类无法延伸,就是不能定义子类。
2.2:final方法:
若实例方法(非静态)声明成final时,该方法无法被子类覆盖重写。
若将类方法(静态)声明成final时,该方法无法被子类所隐藏
2.3final变量
final字段只能赋值一次。
final(非静态)字段赋值分两种方法:(1)声明时赋值(2)通过构造器赋值
final(静态)字段赋值分两种方法:(1)声明时赋值(2)通过静态块赋值
2.3覆盖和隐藏的概念
实例方法被子类方法所覆盖时,实际被调用的方法是在执行时决定的
类方法被子类方法隐藏时,实例被调用的方法是在编译时决定的。
--->immutable不变性很微妙。不是设置finnal,私有化,不提供赋值方法,就是永久不变性的。
final只是不可再次赋值。如果final的字段是一个可变的引用属性,那么immutable,就会被破坏。
room类
1 package com.yeepay.sxf.thread2; 2 /** 3 * 看似是immutable类 4 * 其实不是。 5 * Student是可变的类 6 * @author sxf 7 * 8 */ 9 public final class Room { 10 11 private final Student student; 12 private final String name; 13 14 public Room(String name,Student student) { 15 super(); 16 this.student=student; 17 this.name = name; 18 } 19 20 public Student getStudent() { 21 student.setName("sxf"); 22 return student; 23 } 24 25 public String getName() { 26 return name; 27 } 28 29 }
student类
1 package com.yeepay.sxf.thread2; 2 3 public class Student { 4 private String name; 5 private String address; 6 public Student() { 7 super(); 8 } 9 public Student(String name, String address) { 10 super(); 11 this.name = name; 12 this.address = address; 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 public String getAddress() { 21 return address; 22 } 23 public void setAddress(String address) { 24 this.address = address; 25 } 26 27 28 29 }
测试类
1 package com.yeepay.sxf.thread2; 2 /** 3 * 测试线程 4 * @author sxf 5 * 6 */ 7 public class Test { 8 9 public static void main(String[] args) { 10 11 12 13 Student student=new Student("hsl", "hnlh"); 14 Room room=new Room("ddd", student); 15 Student student2=room.getStudent(); 16 System.out.println(student2.getName()); 17 18 //打印 :sxf 19 } 20 }
immutable范例(immutable只是一个概念模式,而不是一个固定的格式)
1 package com.yeepay.sxf.thread2; 2 /** 3 * 坚不可摧模式。 4 * @author sxf 5 * 6 * 一个类定义成final类,是不允许有子类 7 * 一个变量定义成final变量,意味着,一旦第一次赋值,便不可更改。 8 * 其中的字段也是不可变的 9 * 10 * 11 * 这个不可变性。不一定由final来决定。 12 * 所谓不可变性,是一种设计的模式。不可改变,是为了防止多线程破坏对象。 13 * 这种不可变,不需要保护的前提,就是不能被修改,一旦实例化,只提供读取操作 14 * 而是可以通过很多方式:比如,私有化,不提供赋值操作,final修饰。 15 * 16 */ 17 public final class Persion { 18 //声明变量 19 private final String name; 20 private final String address; 21 22 //构造器赋值 23 public Persion(String name, String address) { 24 this.name = name; 25 this.address = address; 26 } 27 28 //提供get访问方法,但不提供set赋值方法 29 public String getName() { 30 return name; 31 } 32 33 public String getAddress() { 34 return address; 35 } 36 37 38 39 40 41 42 }