码迷,mamicode.com
首页 > 编程语言 > 详细

《Effective Java》读书笔记 - 最小化类的可变性

时间:2018-02-19 11:56:36      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:down   避免   sel   复杂   its   工厂   组件   本质   lex   

Item 15 最小化类的可变性

effective java

如何做到让类不可变?

  1. 不提供改变对象状态的方法。(mutators)
  2. 确保类不会被继承,即用final来限定类。
  3. 让所有的域(field)为final。
  4. 让所有的域private。
  5. 确保所有对可变组件的互斥访问(Ensure exclusive access to any mutable components)

例子:

public final class Complex{
//final class

    private final double re;
    //private final field
    private final double im;

    public Complex(double re,double im){
        this.re = re;
        this.im = im;
    }

    public double realPart(){return re;}
    public double imaginaryPart(){return im;}

    public Complex add(Complex c){
        return new Complex(re+c.re,im+c.im);
        //return new object instead of modify itself
    }

    //Other arithmetic method ommit...
}

为什么要使用不可变对象(immutable objects)?

  1. 不可变对象很简单。不需要考虑对象在变化中是否会变得行为怪异。只要在构造方法中有限制,不可变对象就一直是有效的。
  2. 不可变对象本质上是线程安全的,不需要同步(synchronization)。不可变对象是鼓励共享而不用担心安全。例如以下这种:

    public static final Complex ZERO = new Complex(0,0);
  3. 不可变对象的内部也是鼓励共享的。
  4. 不可变对象作为其他复杂对象的构件(building blocks)是很优秀的。其不变的性质降低了复杂对象的设计难度。

不可变对象的缺点以及优化

  1. 不可变对象的唯一缺点:每次操作都需要创建新对象,在多步操作中造成性能问题。
  2. 优化:
    1. 在多步操作中使用可变的“伴随类”(mutable "companion class")。例如String类与String Buffer类。
    2. 预测哪些多步操作是经常被使用的,提供这些操作的官方方法进行优化。

最佳实践

  1. 提供公有的静态工厂方法(static factory method)并让构造器为私有。
    1. 可以提前检测输入数据的有效性,如果不合法可以直接避免创建对象。
    2. 可以缓存一些常用的对象,优化性能。
    3. 可以添加一些实用的功能。
  2. 制造不可变类的条件可以弱化为任何方法都不能造成对象外部表现的改变。这样我们可以创造一些内部的可变组件用于缓存,进而优化性能。

总结

  1. 设计一个类时首先考虑是否能让它不可变。
  2. 如果类不能做成完全不可变的,将其可变性限制到最低。
  3. 不要在静态工厂方法和构造器之外提供任何的初始化方法。

《Effective Java》读书笔记 - 最小化类的可变性

标签:down   避免   sel   复杂   its   工厂   组件   本质   lex   

原文地址:https://www.cnblogs.com/QEStack/p/8453626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!