《Effective Java》笔记(三)--类和接口

文章目录

  1. 使类和成员的可访问性最小化

以下按照访问级别依次递增

  • private:只有声明该成员的顶层类内部才能访问
  • package-private:default,声明该成员的包内部的任何类都可以访问
  • protected:声明该成员的包内部的任何类都可以访问,声明该成员的类的子类也可以访问
  • public:任何地方都能访问
  1. 要在公有类中使用访问方法而非公有域
  2. 使可变性最小化

不可变类是指实例不能被修改的类

  • 不要提供任何会修改对象状态的方法
  • 保证类不会被扩展
  • 声明所有的域都是final
  • 声明所有的域都是私有的
  • 确保对于任何可变组件的互斥访问
public final class Complex {
    private final double re;
    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 plus(Complex c) {
        return new Complex(this.re + c.re, this.im + c.im);
    }

    public Complex minus(Complex c) {
        return new Complex(this.re - c.re, this.im - c.im);
    }

    public Complex times(Complex c) {
        return new Complex(re * c.re - im * c.im, im * c.re + re * c.im);
    }

    public Complex dividedBy(Complex c) {
        double tmp = c.re * c.re + c.im * c.im;
        return new Complex((re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this)
            return true;
        if (!(obj instanceof Complex))
            return false;
        Complex c = (Complex) obj;
        return Double.compare(c.re, re) == 0 && Double.compare(c.im, im) == 0;
    }

    @Override
    public int hashCode() {
        return 31 * Double.hashCode(re) + Double.hashCode(im);
    }

    @Override
    public String toString() {
        return "(" + re + " + " + im + "i)";
    }
}

不可见对象本质上是线程安全的,它们不要求同步

让一个类不允许自身被子类化,除了使类成为final类,还有另一种方法就是,让类的所有构造器都成为私有的或者包级私有。

public class Complex {
    private final double re;
    private final double im;

    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
    
    public static Complex valueOf(double re,double im){
        return new Complex(re,im);
    }
	...
}
  1. 复合优先于继承

只有当两者之间是“is-a”关系的时候,才应该通过继承扩展类

  1. 要么设计继承并提供文档说明,要么禁止继承
  2. 接口优于抽象类
  3. 为后代设计接口

你可能感兴趣的:(读书笔记,书,博客浏览笔记,java,笔记,开发语言)