类和接口
使类和成员的可访问性最小化
1、尽可能地使每个类或者成员不被外界访问。换句话说,应该使用与你正在编写的软件的对应功能相一致的、尽可能最小的访问级别。例如,想在实体类的中,使用private定义属性值。
在公有类中使用访问方法而非公有域
使可变性最小化
不要提供任何会修改对象状态的方法(也称为 mutator)
保证类不会被扩展。
这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是使这个类成为 final的,但是后面我们还会讨论到其他的做法。
使所有的域都是final的。
通过系统的强制方式,这可以清楚地表明你的意图。而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程,就必需确保正确的行为,正如内存模型( memory model)中所述。
使所有的域都成为私有的。
这样可以防止客户端获得访问被域引用的可变对象的权限,并防止客户端直接修改这些对象。虽然从技术上讲,允许不可变的类具有公有的 final域,只要这些域包含基本类型的值或者指向不可变对象的引1用,但是不建议这样做,因为这样会使得在以后的版本中无法再改变内部的表示法(见第13条)。
确保对于任何可变组件的互斥访问。
如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。并且,永远不要用客户端提供的对象引用来初始化这样的域,也不要从任何访问方法( accessor)中返回该对象引用。在构造器、访问方法和readobject方法(见第76条)中请使用保护性拷贝( defensive copy)技术(见第39条)。
复合优先于继承
不要出现跨包继承。
要么为继承而设计,并提供文档说明,要么就禁止继承
接口优于抽象类
通过 implements 来实现接口,可以多实现。
接口只用于定义类型
类层次优于标签类
用函数对象表示策略
优先考虑静态成员类
泛型
请不要在新代码中使用原生态类型
每个泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。例如,与List
1 | List<Integer> list = new ArrayList<>(); |
消除非受检警告
尽可能的消除代码中的警告信息。如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下才)可以用一个@ SuppressWarnings(“unchecked”)注解来禁止这条警告。
列表优先于数组
优先考虑泛型
优先考虑泛型方法
利用有限制通配符来提升AP的灵活性
优先考虑类型安全的异构容器
枚举和注解
用enum代替int常量
很多常亮不需要定义一大推,只需要使用枚举,定义一个就好了。
用 EnumSet代替位域
用接口模拟可伸缩的枚举
用标记接囗定义类型
标记接口胜过标记注解的另一个优点是,它们可以被更加精确地进行锁定。如果注解类型利用@Target( ElementType.TYPE)声明,它就可以被应用到任何类或者接口。假设有一个标记只适用于特殊接口的实现。如果将它定义成一个标记接口,就可以用它将唯一的接口扩展成它适用的接口。