1. 定义:
      如果某个对象在被创建后,其状态(实例变量)不能被修改,那么这个对象就称为不可变对象。
    2. 优点:

      1. 不可变对象一定是线程安全的(不可变,别的线程修改不了)。
      2. 可作为Map的键值和Set的元素。
    3. 编写不可变类:

      1. 所有字段都是private final。
      2. 没有任何public的方法来修改字段。
      3. 不依赖外部可变对象的引用。(如果依赖外部可变对象,那么当外部可变对象修改时,引用变量会指向新的对象,违反不可变对象的定义)
      4. 不能逸出任何可变对象的引用变量。(逸出引用变量后,外部可以通过引用变量修改对象)。
    1. import java.util.Date;
    2. public final class ImmutableObject {
    3. private final int age;
    4. private final String name;//不可变引用,且创建后指向不可变对象
    5. private final Date date;//不可变引用,可变对象
    6. public ImmutableObject(int age, String name, Date date) {
    7. this.age = age;
    8. this.name = name;
    9. //如果写成this.date=date;就依赖了外部对象。
    10. //因此要重新创建一个Date实例
    11. this.date = new Date(date.getTime());
    12. }
    13. public int getAge() {
    14. return age;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public Date getDate() {
    20. //如果写成return date;就逸出了当前对象的引用,调用者可以
    21. //通过该引用修改Date实例的属性
    22. return new Date(date.getTime());
    23. }
    24. }

    thanks https://my.oschina.net/jackieyeah/blog/205198