zoukankan      html  css  js  c++  java
  • 不可变对象

    可变性最小化

    1. 不可变类的概念

    不可变类是指其实例不能被修改的类——实例包含的信息必须在创建实例的时候就提供,并且在对象的整个生命周期(lifetime)内固定不变。在 Java 类库中就有许多这样的不可变类,例如 String、BigDecimal、BigInteger、基本类型的包装类。设计者将类设计成不可变类的理由有很多:易于设计、已于使用、更加安全、不易出错。

    1.1 优点

    因为不可变对象可以只有一种状态(即对象被创建时的状态),所以如果需要使类的对象满足某种约束条件,仅需在构造函数添加约束即可,只要对象能被成功创建,之后使用对象时就不再需要进行校验。

    不可变对象本质上是线程安全的,它们不要求同步。当多个线程并发访问不可变对象时,它们不会遭到破坏。这无疑是获得线程安全最容易的方式。因此,不可变对象可以自由的被共享

    1.2 缺点

    不可变对象唯一的缺点是:对于每个不同的值都需要一个单独的对象,而某些对象创建的代价可能很大。

    2. 不可变类的设计原则

    设计不可变类,需要遵循以下规则:

    1. 不提供任何可以修改对象状态的方法

    2. 确保类不会被拓展。这样做的目的是防止子类破坏该类的不可变性,常用的做法是将类声明为 final 的。

    3. 声明所有的域都是 final 的

    4. 声明所有的域都是 private 的。这样做的目的是防止客户端访问并修改域所指向的可变对象。

    5. 确保对于任何可变组件的互斥访问。如果类具有指向可变对象的域,必须确保该类的客户端无法获得指向这个对象的引用。并且,永远不要直接使用客户端提供的对象引用初始化这样的域,在必要的时候进行保护性拷贝(defensive copy)。

      graph LR class_[类] customer[客户端] changeableObject(可变对象) class_ --> changeableObject customer --> changeableObject

      保护性拷贝:

      graph LR class_[类] customer[客户端] changeableObject(可变对象) cloneObject(拷贝对象) class_ --> cloneObject customer --> changeableObject

    3. 函数式方法

    基于给定的操作数进行运算但不会修改操作数的方法被称为函数式方法(functional method),与之相反,操作数在运算的过程中会被改变的方法被称为过程式方法(procedural method)、命令式方法(imperative method)。

    /**
     * @author xzy
     * @date 2020-09-08 20:32
     * 说明:二维坐标点
     */
    public class Point {
        /** x轴坐标 */
        private final double x;
        /** y轴坐标 */
        private final double y;
    
        public double getX() { return x; }
    
        public double getY() { return y; }
    
        public Point(double x, double y) { this.x = x; this.y = y; }
    
        /**
         * 向左移动
         *
         * @param x - 左移距离
         * @return - 新坐标点
         */
        public Point onTheLeft(double x) {
            return new Point(this.x - x, this.y);
        }
    }
    

    上面代码中的 onTheLeft 方法就是一个函数式方法。一般函数式方法都以介词命名,过程式方法都以动词命名,以强调操作数的状态是否改变。

  • 相关阅读:
    201521123121 《Java程序设计》第9周学习总结
    201521123121 《JAVA程序设计》第8周学习总结
    201521123121 《JAVA程序设计》第7周学习总结
    201521123121 《JAVA程序设计》第6周学习总结
    201521123121 《Java程序设计》第5周学习总结
    201521123121 《Java程序设计》第4周学习总结
    201521123121 《Java程序设计》第3周学习总结
    201521123118《java程序与设计》第11周学习总结
    201521123118《java程序与设计》第10周学习总结
    201521123118《java程序与设计》第8周学习总结
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/13642818.html
Copyright © 2011-2022 走看看