第4章 类和接口

类和接口是Java程序设计语言的核心,它们也是Java语言的基本抽象单元。Java语言提供了许多强大的基本元素,供程序员用来设计类和接口。

13. 使类和成员的可访问性最小化

要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰隔离开来。然后,模块直接只通过他们的API进行通信。一个模块不需要知道其他模块的内部工作情况。这个概念被称为信息隐藏或封装,是软件设计的基本原则之一。

Java程序语言提供了许多机制来协助信息隐藏。访问控制机制决定了类,接口和成员的可访问性。

实体的可访问性是由该实体声明所在的位置,以及该实体声明中所出现的访问修饰符(private,protected和public)共同决定的。

对于顶层的类和接口,只有两种可能的访问级别:包级私有和公有。

如果一个包级私有的顶层类或接口,只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个类的私有嵌套类。这样可以将它的可访问访问从包中的所有类缩小到了使用它的那个类。

对于成员(域,方法,嵌套类或嵌套接口)有4种访问级别:

  • 私有的--只有在声明该成员的顶层类内部才可以访问这个成员;
  • 包级私有的--缺省访问级别,没有为成员指定访问修饰符;
  • 受保护的--声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员;
  • 公有的--在任何地方都可以访问该成员;

实例域决不能是公有的,如果域是非final的,或者是一个指向可变对象的final引用,那个一旦使这个域成为公有的,就放弃了堆存储在这个域中的值进行限制的能力,这意味着,你也放弃了强制这个域不可变的能力。

长度非零的数组总是可变的,所以类具有公有的静态final数组域,或者返回这种域的访问方法,这几乎总是错误的。

private static final Thing[] VLAUES = {...}
public static fianl List<Thing> VALUES_LIST = Collections.unmodifiableList(Arrays.asList(VALUES)) 或 public static final Thing[] values() {
return VALUES.clone();
}  

总结:尽可能降低可访问性,除了公有静态final域的特殊情形之外,公有类都不应该包含公有域。并且要确保公有静态final域所引用的对象都是不可变的。

14. 在公有类中使用访问方法而非公有域

公有类永远都不应该暴露可变的域。

15. 使可变性最小化

不可变类只是其实例不能被修改的类,每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。

存在不可变类有许多理由:不可变的类比可变类更加易于设计、实现和使用,不容易出错,且更加安全。

为了使类称为不可变,要遵循下面5条规则:

  1. 不要提供任何会修改对象状态的方法;
  2. 保证类不会被扩展;
  3. 使所有的域都是final的;
  4. 使所有的域都成为私有的;
  5. 确保对于任何可变组件的互斥访问

除非有令人信服的理由要使域变成是非final的,否则要使每个域都是final的。

16. 复合优先于继承

与方法调用不同的是,继承打破了封装性。换句话说,子类依赖于其超类中特定功能的实现细节。超类的实现有可能会随着发行版的不同而有所变化,如果真的发生了变化,子类可能会遭到破坏,即使它的代码完全没有改变。因此,子类必须要跟着其超类的更新而演变。

17. 要么为继承而设计,并提供文档说明,要么就禁止继承

18. 接口优于抽象类

接口和抽象类明显的区别在于,抽象类允许包含某些方法的实现,但是接口则不允许。

(1)现有的类可以很容易被更新,以实现新的接口。当Comparable接口被引入到Java平台中时,会更新虚度现有的类,以实现Comparable接口。因为Java支持单继承多多实现。

(2)接口是定义mixin(混合类型)的理想选择。

(3)接口允许我们构造非层次结构的类型框架。

x.参考文档

《Effective Java中文版 第2版》

Effective Java-第4章的更多相关文章

  1. EFFECTIVE JAVA 第十一章 系列化

    EFFECTIVE  JAVA  第十一章  系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...

  2. effective java 第2章-创建和销毁对象 读书笔记

    背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...

  3. [Effective Java]第六章 枚举和注解

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. [Effective Java]第五章 泛型

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. 对于所有对象都通用方法的解读(Effective Java 第三章)

    这篇博文主要介绍覆盖Object中的方法要注意的事项以及Comparable.compareTo()方法. 一.谨慎覆盖equals()方法 其实平时很少要用到覆盖equals方法的情况,没有什么特殊 ...

  9. [Effective Java]第十一章 序列化

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. 【Effective Java】第二章-创建和销毁对象——1.考虑用静态工厂方法代替构造器

    静态工厂方法的优点: 可以赋予一个具有明确含义的名称 可以复用唯一实例,不必每次新建 可以返回原实例类型的子类对象 可以在返回泛型实例时更加简洁 缺点: 类如果不含有共有的或者受保护的构造器,就不能被 ...

随机推荐

  1. HDU 4639 Hehe (2013多校4 1008 水题)

    Hehe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. 使用Busybox制作CRAMFS文件系统成功

    转:http://www.360doc.com/content/11/1013/22/7775902_155877501.shtml 这几天在使用Busybox制作FS2410开发板的CRAMFS文件 ...

  3. vscode快捷键-for mac

    默认显示当前所有页面: command p ?: 显示可操作方法 >: 打开命令面板, 同comand shift p : : 跳转到对应行数 @: 搜索并跳转到应变量或函数 @: : 同上,分 ...

  4. rocketmq,zookeeper,redis分别持久化的方式

    1.rocketmq持久化: RocketMQ 的所有消息都是持久化的, 先写入系统 PAGECACHE, 然后刷盘, 可以保证内存与磁盘都有一份数据,访问时,直接从内存读取. RocketMQ 的所 ...

  5. IOS是否在项目中存在,所使用的反射那点事

    NSClassFromString,NSSelectorFromString,isKingOfClass 1. NSClassFromString 这种方法推断类是否存在,假设存在就动态载入的,不存为 ...

  6. shadow mapping实现动态shadow实现记录 【转】

    http://blog.csdn.net/iaccepted/article/details/45826539 前段时间一直在弄一个室内场景,首先完成了render,效果还可以.然后给其加上shado ...

  7. 什么是JSONP?

    一.先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助 ...

  8. VB6.0 中 碰到 提示rs对象关闭,不允许操作, 吃一堑长一智

    VB6.0 中 碰到 提示rs对象关闭,不允许操作,  吃一堑长一智 如果碰到 这个错误提示 则请检查 你执行的每一个语句中的数据类型,包括 如果有存储过程的话,还要检查 存储过程中每一个变量和数据表 ...

  9. [Android Pro] android中permission_group与permisson区别、作用

    转载:http://blog.csdn.net/feng88724/article/details/6409313 其实Android在定义 permission 时, 为每个Permission都进 ...

  10. MyEclipse8.0 注册码生成代码

    转自:http://blog.sina.com.cn/s/blog_7ad29e00010199xt.html package com.guaicaicc.register; import java. ...