Effective JAVA 第三期
类和接口是java程序设计语言的核心,也是java的基本抽象单元。
将类和接口应用好可以更好的利用java提供的基本元素,下面的几条方法可以有效的帮助到我们使用好java的类和接口。
第一:使类和成员的可访问性最小化:
Java通过封装和修饰符等手段限制访问权限,尽量降低类的可访问性,可以降低风险,应成员变量和成员方法的访问权限降低,尤其是成员变量,尽量使用private修饰,如果不是很有必要,不要使用成员变量,成员变量在并发条件下容易引发线程安全问题,为了防止出现这种问题,使用同步等方式会增加开销。
访问级别有如下四种:
1. 私有;
2. 包级私有;
3. 受保护的;
4. 公有的。
第二:在共有类中使用访问方法而非公有域:
公有类不应该暴露可变的域。
如果类可以在它所在的包的外部进行访问,就提供访问方法,已保留将来改变该类的内部表示法的灵活性,如果暴露了数据域,要想在将来改变其内部表示法是不可能的了。
虽然让公有类暴露不可变的域危害比较小。但是,有时候还是需要用包级私有或者私有的嵌套类来暴露域,不管类是否可变。
第三: 复合优先于继承:
继承是实现代码重用的有力手段,但并非永远是完成这项工作的最佳工具。使用不当则会导致软件变得脆弱。
继承打破了封装性,也就是说,子类依赖于父类中特定功能的实现细节。因此可能会发生变化,子类也就会被破坏。
故继承被认为是破坏封装性的表现。
第四:要么为继承而设计,并提供文档说明,要么就禁止继承
第五:接口优于抽象类,接口只用于定义类型
Java不支持多继承,可以通过接口定义规则,类实现接口,重写接口里面的方法,这种方法比通过继承抽象类更好,当一些类有很多公共逻辑的时候,可以考虑放在抽象类中,注意抽象类是无法实例化的,切记接口的职责要单一!!!如果接口中定义规则(接口中的方法),类可能会Override一些没有必要重写的方法。
接口中有一种接口被称为常量接口,这种接口没有任何方法,只包含静态的final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。
接口应该只被用来定义类型,不应该用来导出常量。
第六:类层次优于标签类
标签类中存在这很多缺点,他们中充斥着样板代码,枚举声明等,内存也占用多了,不仅破坏了程序的可读性,还可能使程序崩溃。
第七:用函数对象表示策略:
第八:优先考虑静态成员类
嵌套类有四种:静态成员类,非静态成员类,匿名类和局部类。
上述的四种都有自己的用途,如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的,否则为静态的。