《Effective Java》第4章 类和接口

类和接口是Java程序设计语言的核心,那么类和接口的设计上必然会有一些大师的指导性原则,能够指导我们设计出有用,健壮和灵活的类和接口。

  1. 使类和成员的可访问性最小化【Item 13】
    1) 设计良好的模块会隐藏所有的实现细节,把它的API和实现清晰的隔离开,模块之间只通过API进行通信,一个模块不需要知道其它模块的内部工作情况,这叫做信息隐藏,在类的角度来说就是保持好的封装性
    2)封装的优点:
    a.有效的解除组成系统的各模块之间的耦合关系,使得这些模块可以独立进行开发,测试,优化,使用,理解和优化。
    b.信息隐藏对于开发速度,可维护性,系统性能分模块剖析便利性的提升有很大的优势,可以保证在调整某个模块不影响其它模块
    c.提高了软件的可重用性,因为模块比较独立,如其它系统有需要可以直接挪过去复用
    d.信息隐藏降低了构建大型系统的风险,即使整个系统不可用,但是这些独立的模块却可能是有用的
    3)Java语言中关于支持封装性实现的机制
    a.访问控制机制决定了类、接口和成员的可访问性
    b.实例的可访问性由该实例所声明的位置,以及该实例声明中所出现的访问修饰符共同决定
    4)封装实现的一些注意点
    a.尽可能地使每个类或者成员不被外界访问
    复习下访问级别,详细的还得参考java语言定义:
    private:只在声明该成员的顶层类内部才可以访问这个成员
    package:缺省(default)访问级别,声明该成员的包内部任何类都可以访问这个成员
    protected:声明该成员的类的子类可以访问这个成员,并且该成员的包内部的任何类都可以访问这个成员
    public:在任何地方都可以访问该成员
    public和protected的成员将被作为API导出,一旦发布必须永久支持,慎重
    b.protected成员少用
    c.子类override超类的方法时,只能扩大访问范围,不能缩小,这样确保任何使用超类的实例的地方都可以使用子类的实例,保证继承is-a的特性
    d.实例域局不能是公有的,包含公有可变域的类并不是线程安全的,一旦把实例域设计为公有的,就失去了对该实例成员的控制权限,虽然你可能将该成员定义为final,但是只是引用不可变,里面的值可能被修改
    e.静态域也不建议作为公有的,常量除外,引用类型的实例域不建议作为公有,因为即使final显示引用不能修改,但是引用指向的对象是可能被修改的
    f.长度非零的数组总是可变的,因为数组也是引用类型,类具有公有的静态final数组域或者返回这种域的访问方法,这几乎总是错误的
    g.尽可能的降低可访问性,访问级别尽量从最低开始设计,如果非得升级访问权限需要有充分的原因
    h.防止把任何散乱的类、接口和成员变成API的一部分
  2. 在公有类中使用访问方法而非公有域【Item 14】
    1)公有类不应该直接暴露数据域,如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性
    2)如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误,因为访问范围本身比较小,也不需要遵循API的延续不可更改性
  3. 使可变性最小化【Item 15】
    1)遵循如下规则使类成为不可变,不可变类只是其实例不能被修改的类,每个实例包含的信息必须在创建时提供,并

你可能感兴趣的:(Effective,Java,java)