目录
接口和类
1.最小化类和成员的访问权限
功能模块对外隐藏内部的信息(封装),而Java中的类就可以看作是一个模块.
在自己设计类的时候,应尽可能的是每个类或类的成员不被外界访问,尽可能提供最小的访问权限.
public class Apple {
// 设为private, 对这个类的字段信息进行封装
private String type;
private Double weight;
// ...
}
1.private 只有声明这个字段的类的内部才能访问(类私有)
2.default 包内部的任何类都可以访问(包私有)
3.protected 包内任何类和子类可以访问这个字段(包和子类私有)
4.public 任何地方都可以访问
公有类的字段提供访问方法而非设为公有字段
公有类的字段不应直接暴露(不能设为public,这样没有对类进行封装),而应该提供访问(getter)和修改(setter)方法.
最小化可变性
不可变类是其实例不能被修改的类,每个实例中包含的所有信息都必须在创建的时候提供,并在整个对象的生命周期内固定不变.
Java类库中的不可变类:String, 基本类型包装类, BigInteger, BigDecimal
设计一个不可变类应纯熟的规则:
1.不提供任何修改对象状态的方法
2.保证类不会被扩展(将类设为final不可继承)
3.类的所有字段都设为final
4.所有字段都设为私有
5.保证对任何可变的组件独占访问
复合优于继承
在包内部使用继承非常安全,因为子类和父类的实现都是由同一程序员控制.但对于跨包边界的继承,则是非常危险的,同时继承违破坏封装.
复合(composition): 不扩展现有的类,而是在新设计的类中增加一个私有字段,引用一个现有类的实例,这种设计被称为复合.
这样现有的类就变成了新设计的类当中的一个组件,新类中的每个实例方法都可以调用包含现有类的实例中对应的方法,并返回结果,这样设计的类就不会依赖于现有类的实现细节,达到解耦的效果.
对于继承的类提供文档说明,否则禁用继承
接口优于抽象类
接口只用于定义类型
类继承优于标签类
用函数对象表示策略
这条针对JDK8以下版本,还没有lambda表达式.如果需要调用一个方法,就需要
优先考虑静态成员类
嵌套类(nested class):被定义在另一个类中的类.
嵌套类存在的目的应该只是为了它的外围类(enclosing class)提供服务.
嵌套类有4种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)、局部类(local class).
第一种之外的三种被称为内部类.
静态成员类可以看作是一个普通的类,只是被定义在了另外一个类的内部,它可以访问外围类的所有成员.静态类是外围类的一个静态成员,也遵守访问规则,如果被声明为私有,这只有外围类可以访问.