软件构造(一)

每个对象包含了自身的状态和行为。行为能够通过接口导出。

  • class just as template for objects
    • class隐式对应着一个接口
  • OO特性-1: 通过相同的接口动态分发
    • 能够支持单个接口的多实现
    • 接口有助于信息隐藏
  • OO特性-2: 信息隐藏(encapsulation)
    • class level: java通过访问修饰符,js通过闭包实现
    • file level: js通过modules实现

Item 15: Minimize the accessibility of classes and members

仔细考虑类以及类成员的可访问性。

  • 对于类: 顶层类只可能为publicpackage-private。当顶层类声明为public时,它成为了API的一部分。
  • 对于类内的成员
    • field: 除了public static final域,其余实例域都应该声明为非公共
    • method: 最小化可访问性
      • protected: 同一包内或子类后代能够访问。因此protected成员也是类导出API的一部分。该修饰符应当很少被使用。
    • 子类访问能力的修改
      • 子类成员不应有比父类成员弱的访问能力: 目的在于保证任何基类可拥有的行为,子类也能有(里氏替换法则)
    • 注意: 为了测试,能够接受将私有成员声明为package-private成员,但是不能接受将它们作为package的导出API

Item 16: In public classes, use accessor methods, not public fields

  • 公共类: 永远不应当暴露可变域,对于不可变域,尽量不要暴露。
    • 对域使用private,并通过公共的gettersetter导出。这样就隐藏了底层实现,并能更好地施加不变式等。
  • package-private类和私有嵌套类: 可以直接使用公共域