- Effective Java Items about Classes and Interfaces
- Item 15: Minimize the accessibility of classes and members
- Item 16: In public classes, use accessor methods, not public fields
- Item 17: Minimize mutability
- Item 18: Favor composition over inheritance
- Item 19: Design and document for inheritance or else prohibit it
- Item 20: Prefer interfaces to abstract classes
- Item 21: Design interfaces for posterity
- Item 22: Use interfaces only to define types
- Item 23: Prefer class hierarchies to tagged classes
- Item 24: Favor static member classes over nonstatic
- Item 25: Limit source files to a single top-level class
Effective Java Items about Classes and Interfaces
类和接口是Java的核心,其也是Java的基本抽象单元。Java提供了许多强大的基本元素,供程序员用来设计类和接口。以下一些指导原则可以帮助我们更好地利用这些元素设计出更加有用、健壮和灵活的类和接口。
Item 15: Minimize the accessibility of classes and members
使类和成员的可访问性最小化。我们始终应该尽可能地降低可访问性。你在仔细地设计了一个最小的公有API之后,应该防止把任何散乱的类、接口和成员变成API的一部分。除了公有静态final域的特殊情形之外,公有类都不应该包含公有域。并且要确保公有静态final所引用的对象都是不可变得。
Item 16: In public classes, use accessor methods, not public fields
在公有类中使用访问方法而非公有域。公有类永远都不应该暴露可变的域,虽然还是有问题,但是让公有类暴露不可变的域其危害比较小。但是,有时候会需要用包级私有的或者私有的嵌套来暴露域,无论这个类是可变的还是不可变的。
Item 17: Minimize mutability
使可变性最小化。不可变的类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。为了使类成为不可变,要遵循以下五条规则:
1、不要提供任何会修改对象状态的方法。
2、保证类不会被扩展。一般做法是使这个类成为final的。
3、使所有的域都是final的。
4、使所有的域都成为私有的。
5、确保对于任何可变组件的互斥访问。
不可变对象本质上是线程安全的,它们不要求同步。不可变类可以被自由地共享。永远也不需要对不可变类进行保护性拷贝。不仅可以共享不可变对象,甚至也可以共享它们的内部信息。不可变对象为其他对象提供了大量的构件,无论是可变的还是不可变的。不可变类真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。
为了确保不可变类不被子类化。除了使得类成为final的方法之外,还可以让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂来代替公有的构造器。
Item 18: Favor composition over inheritance
复合优先于继承。继承的功能非常强大,但是也存在诸多问题,因为它违背了封装原则。只有当子类和超类之间确实存在子类型关系时,使用继承才是恰当的。即便如此,如果子类和超类处在不同的包中,并且超类并不是为了继承而设计的,那么继承将会导致脆弱性。为了避免这种脆弱性,可以用复合和转发机制来代替继承,尤其是当存在适当的接口可以实现包装类的时候。包装类不仅比子类更加健壮,而且功能也更加强大。
Item 19: Design and document for inheritance or else prohibit it
要么为继承而设计,并提供说明文档,要么就禁止继承。