Effective Java 读书笔记之三 类和接口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Java 读书笔记之三 类和接口相关的知识,希望对你有一定的参考价值。
一、使类和成员的可访问性最小化
1、尽可能地使每个类或者成员不被外界访问。
2、实例域决不能是共有的。包含公有可变域的类不是线程安全的。
3、除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且确保公有静态final域所引用的对象不可变。
二、在公有类中使用访问方法而非公有域
1、如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误。
2、公有类永远都不应该暴露可变的域。
三、使可变性最小化
不可变的类是指其实例不能被修改的类。为使类不可变,需要遵循以下五条规则
1、不要提供任何会修改对象状态的方法
2、保证类不会被扩展
3、使所有的域都成为私有的
4、使所有的域都成为final的
5、确保对于任何可变组件的互斥访问
不可变对象本质上是线程安全的,他们不要求同步。
如果不可变类实现Serializable接口,并且包含指向可变对象的域,必须提供显式的readObject或者readResolve方法。
尽可能地限制类的可变性,除非有理由把域变成非final的,或者要使每个域都是final的。
四、复合优先于继承
1、继承打破了封装性
2、只有当子类真正是超类的子类新时,才是和用继承。
3、使用继承会把超类API中的所有缺陷传播到子类中,而复合则允许设计新的API来隐藏这些缺陷。
五、要么为了继承而设计,并提供文档说明,要么就禁止继承
1、注意父类中各方法之间的相互调用,特别是可被覆盖的方法。一定要在文档中说明其自用性。
2、类必须提供适当的钩子,以便能进入到它的内部工作流程中。可以是受保护的方法,也可以是受保护的域。
3、对于为了继承而设计的类,唯一的测试方法就是编写子类。经验表明,三个子类通常可以测试一个可扩展的类。
4、构造器、静态工厂方法和其他具有构造对象功能的方法决不能调用可被覆盖的方法。
5、为了继承而设计类的时候,Cloneable和Serializable接口出现了特殊的困难。
6、通过完全消除类中的可覆盖方法的自用特性,也可以创建”能够安全地进行子类化“的类。
六、接口优于抽象类
抽象类本质上类,接受类只能单继承的约束。这是其与接口的最大区别。接口的优势有:
1、现有的类可以很容易地进行更新,以实现新的接口。
2、接口是定义mixin(混合类型)的理想选择
3、接口允许我们构造非层次结构的类型框架
4、接口可以安全地增强类的功能。
5、通过为重要的接口提供一个抽象的骨架实现,把接口和抽象类的优点结合起来了。
抽象类来定义允许多个实现的类型,与接口相比有一个明显的优势:抽象类的演变比接口的演变要容易的多。
七、接口只用于定义类型
1、常量接口模式是对接口的不良使用。
八、类层次结构优于标签类
1、标签类过于冗长、容易出错,并且效率低下。
九、用函数对象表示策略
1、利用对象引用实现函数指针的功能,可以实现策略模式。
十、优先考虑静态成员类
1、非静态成员类的每个实例都隐含着与外围类的一个外围实例想关联。在其被创建时,关联关系也建立了,这个关系不能被修改了。
以上是关于Effective Java 读书笔记之三 类和接口的主要内容,如果未能解决你的问题,请参考以下文章