Effective Java之类和接口 总结

版权声明:https://blog.csdn.net/qq_26814945 https://blog.csdn.net/qq_26814945/article/details/87939083

第13条 使类和成员的可访问性最小化
尽可能地使每个类或者成员不被外界访问
实例域决不能是公有的
包含公有可变域的类并不是线程安全的
类具有公有的静态final数组域 或者返回这种域的访问方法 这几乎总是错误的

第14条 在公有类中使用访问方法而非公有域
如果类可以在它所在的包的外部进行访问 就提供访问方法
如果类是包级私有的 或者是私有的嵌套类 直接暴露它的数据域并没有本质的错误

第15条 使可变性最小化
为了使类成为不可变 要遵循下面五条规则:
1不要提供任何会修改对象状态的方法
2保证类不会被扩展
3使所有的域都是final的
4使所有的域都成为私有的
5确保对于任何可变组件的互斥访问

不可变对象本质上是线程安全的 它们不要求同步
不可变对象可以被自由地共享
不仅可以共享不可变对象 甚至也可以共享它们的内部信息
不可变对象为其他对象提供了大量的构件
不可变类真正唯一的缺点是 对于每个不同的值都需要一个单独的对象
除非有很好的理由要让类成为可变的类 否则就应该是不可变的
如果类不能被做成是不可变的 仍然应该尽可能地限制它的可变性
除非有令人信服的理由要使域变成是非 final的 否则要使每个域都是final的

第16条 复合优先于继承
与方法调用不同的是 继承打破了封装性

第17条 要么为继承而设计 并提供文档说明 要么就禁止继承
该类必须有文档说明它可覆盖的方法的自用性
类必须通过某种形式提供适当的钩子 以便能够进入到它的内部工作流程中 这种形式可以是精心选择的受保护的方法 也可以是受保护的域 后者比较少见
对于为了继承而设计的类 唯一的测试方法就是编写子类
必须在发布类之前先编写子类对类进行测试
构造器决不能调用可被覆盖的方法
无论是clone还是readObject 都不可以调用可覆盖的方法 不管是以直接还是间接的方式
为了继承而设计类 对这个类会有一些实质性的限制
对于那些并非为了安全地进行子类化而设计和编写文档的类 要禁止子类化

第18条 接口优于抽象类
现有的类可以很容易被更新 以实现新的接口
接口是定义mixin(混合类型)的理想选择
接口允许我们构造非层次结构的类型框架
通过包装类模式 接口使得安全地增强类的功能成为可能
通过对你导出的每个重要接口都提供一个抽象的骨架实现类 把接口和抽象类的优点结合起来
抽象类的演变比接口的演变要容易得多
接口一旦被公开发行 并且已被广泛实现 再想改变这个接口几乎是不可能的

第19条 接口只用于定义类型
常量接口模式是对接口的不良使用 接口应该只被用来定义类型

第20条 类层次优于标签类
标签类过于冗长 容易出错 并且效率低下
子类型化 标签类正是类层次的一种简单的效仿

第21条 用函数对象表示策略
函数指针的只要用途就是实现策略模式

第22条 优先考虑静态成员类
嵌套类有四种:静态成员类 非静态成员类 匿名类 局部类

猜你喜欢

转载自blog.csdn.net/qq_26814945/article/details/87939083