第4章 类和接口

类和接口是Java编程语言的核心,它们也是Java语言的基本抽象单元。

第15条:使类和成员的可访问性最小化

规则很简单:尽可能地使每个类或者成员不被外界访问。

对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:
	私有的(private) ------只有在声明该成员的顶层类内部才可以访问这个成员。
	包级私有的(package-private) -----声明该成员的包内部的任何类都可以访问这个成员。从技术上讲,它被称为“缺省”(default)访问级别。
	受保护的(protected) -----声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。
	公有的(public)  -----在任何地方都可以访问该成员。

第16条:要在公有类而非公有域中使用访问方法

也就是应该适应包含私有域和公有访问方法(getter)的类代替。

第17条:使可变性最小化

为了使类成为不可变,要遵循下面五条规则:

  1. 不要提供任何会修改对象状态的方法。(也就是设值方法)。
  2. 保证类不会被扩展。
  3. 声明所有的域都是final的。
  4. 声明所有的域都为私有的。
  5. 确保对于任何可变组件的互斥访问。

第18条:复合优先于继承

第19条:要么设计继承并提供文档说明,要么禁止继承

第20条:接口优于抽象类

区别:接口完全是抽象的。它根本不存在方法的实现;而抽象类它可以有默认的方法实现
好处:

  1. 现有的类可以很容易被更新,以实现新的接口。
  2. 接口是定义mixin(混合类型)的理想选择。
  3. 接口允许构造非层次结构的类型框架。
    例如:假设我们有一个接口代表一个singer(歌唱家),另一个接口代表一个songwriter(作曲家):
    public interface Singer {
           
    	AudioClip sing(Song s);
    }
    public interface Songwriter {
           
    	Song compose(int chartPosition);
    }
    // 现实生活中 有些歌唱家本身也是作曲家
    public interface SingerSongwriter extend Singer, Songwriter {
           
    	AudioClip strum();
    	void actSensitive();
    }
    
  4. 接口使得安全地增加类的功能成为可能
  5. 对于骨架实现类而言,好的文档绝对是非常必要的。

第21条:为后代设计接口

第22条:接口只用于定义类型

有一种接口被称为常量接口,例如:

	//物理常量
	public interface PhysicalConstants {
     
		static final double AVOGADROS_NUMBER = 6.022_140_587e23;
		static final double ELECTRON_MASS = 9.109_383_56e-31;
	}

常量接口模式使对接口的不良使用。
应该使用不可实例化的工具类:

	//物理常量
	public class PhysicalConstants {
     
		private PhysicalConstants(){
     }
		
		public static final double AVOGADROS_NUMBER = 6.022_140_587e23;
		public static final double ELECTRON_MASS = 9.109_383_56e-31;
	}

第23条:类层次优于标签类

第24条:静态成员优于非静态成员类

第25条:限制源文件为单个顶级类

你可能感兴趣的:(effective,Java)