目录
第13条: 使类和成员的可访问性最小化
第14条:在公有类中使用访问方法而非公有域
第15条:使可变性最小化
第16条:复合优先于继承
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承
第18条:接口优先于抽象类
第19条:接口只用于定义类型
第20条:类层次优于标签类
第21条:用函数对象表示策略
第22条:优先考虑静态成员类
 

第4章 类和接口

第13条: 使类和成员的可访问性最小化

尽可能使每个类或者成员不被外界访问。提供尽可能小的访问级别。

final维持字段不可变性,字段要么是基本类型的、要么是指向不可变对象的引用。

如果final包含可变对象的引用,虽然引用不能被修改,但是引用对象的内部却可以被修改。

注意:长度非0的数组总是可变的。

第14条:在公有类中使用访问方法而非公有域

第15条:使可变性最小化

讲了不可变类的相关内容。

不可变类:实例不能被修改的类。实例化后,实例中包含的内部信息在整个生命周期中固定不变。

如何使类不可变

1)不提供任何修改对象状态的方法

2)保证类不会被扩展。如将类声明为final

3)使所有的域都是final的

4)所有的域都是私有的

5)对任何可变域(指指向可变对象的域),使用保护性拷贝技术

不可变对象的好处:线程安全,可以自由共享

不可变类的唯一缺点:每个不同的值都要有一个单独的对象,比如String s = ”aaa", String s2 = "bbb"。

因不可变类的缺点,可以提供一个可变配套类,比如对String来说有StringBuilder

第16条:复合优先于继承

这里的继承指的是一个类扩展另一个类的时候,不含接口继承(类实现接口、接口实现接口)。

只有当两个类A和B,两者之间确实存在is a关系的时候,才适合用继承。问自己:每个B都是A吗?

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

如果某个类是为继承而设计的,在类文档中应该明确描述覆盖每个方法所带来的影响。

第18条:接口优先于抽象类

接口和抽象类区别

1)抽象类允许包含某些方法的实现,接口不允许。

2)实现抽象类,类必须成为抽象类的子类。但是,任何一个类均可实现一个接口,不管这个类位于类继承层次的哪个位置。

接口的好处:

1)现有类很容易通过实现新的接口,实现新的功能,不管这个类位于类继承层次的哪个位置。

2)接口是定义mixin类型的理想原则。

mixin类型:指类除了实现它的基本功能外,还可以实现mixin类型,以表明它提供了某种可供选择的功能。

举例:Comparable是mixin接口,某个类实现后代表具备排序功能。

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

举例:singer接口代表歌唱家,songwriter接口代表作曲家,我们完全可以声明一个SingerSongwriter接口扩展上面两个接口,代表同时歌唱家也是作曲家。

接口不允许含方法的实现。但是可提供个抽象的骨架实现类。接口用于定义类型,但是骨架实现类用于接口接口实现相关工作。

举例:集合框架中的AbstractCollection、AbstractSet等都是骨架实现类。

第19条:接口只用于定义类型

讲了不要使用常量接口。常量接口类似于下面。

public interface XXXXContants {
static final double XXXXXX = 1.1222;
static final double YYYYYY = 1.3222;
}

常量接口的坏处:在版本迭代时,某个类不再使用这些常量了,仍必须实现这个接口,以确保二进制兼容性。

如何定义常量。

1)常量与某个类或接口紧密相关,定义在这个类后接口中。

举例:Integer中的常量MIN_VALUE

2)使用枚举类型

3)使用常量工具类。

第20条:类层次优于标签类

第21条:用函数对象表示策略

Java中没有函数指针,但是可以用对象引用实现同样的功能,这样的实例称为函数对象,举例:Comparator类定义了排序策略。

第22条:优先考虑静态成员类

讲了嵌套类,主要是各种内部类的使用场景。

嵌套类有4种:

1)内部类:静态内部类、非静态内部类、匿名内部类

2)局部类

静态内部类

静态内部类常见用法是用作辅助类。举例:Calculator内部声明一个静态枚举类Operation用于表示计算器支持的各种操作。Calculator.Operation.PLUS,Calculator.Operation.MINUS。

私有静态内部类的常见用法是用来代表外部类所代表的对象的组件。举例:Map的Entry。

非静态内部类

非静态内部类的常见用法是定义一个Adapter。举例:Map接口使用非静态内部类来实现集合视图(collection view),如keySet、entrySet等。

静态内部类和非静态内部类的区别

1)静态内部类可看做是普通的类,只是碰巧声明在另一个类的内部。可以脱离外部类的实例独立存在。

2)非静态内部类的每个实例都与外部类的一个实例向关联,当非静态内部类被创建时,这种联系建立起来。

匿名内部类

匿名内部类常见用法

1)创建函数对象。举例:排序时,创建匿名Comparator实例,传递给sort方法。

2)创建过程对象。举例:Runnable、Thread

局部类

在任何可声明局部变量的地方,都可声明局部类。

《Effective Java 2nd》第4章 类和接口的更多相关文章

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

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

  2. Effective Java 读书笔记之三 类和接口

    一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含 ...

  3. EFFECTIVE JAVA 第十一章 系列化

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

  4. IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  5. 《Effective Java》第4章 类和接口

    第13条:使类和成员的可访问性最小化 第一规则很简单:尽可能地使每个类或者成员不被外界访问.换句话说.应该使用与你正在编写的软件的对应功能相一致的.尽可能最小的访问级别. 对于顶层的(非嵌套的)类和接 ...

  6. [Java读书笔记] Effective Java(Third Edition) 第 4 章 类和接口

    第 15 条: 使类和成员的可访问性最小化 软件设计基本原则:信息隐藏和封装. 信息隐藏可以有效解耦,使组件可以独立地开发.测试.优化.使用和修改.   经验法则:尽可能地使每个类或者成员不被外界访问 ...

  7. [Effective Java]第七章 方法

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

  8. [Effective Java]第五章 泛型

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

  9. Effective Java 第三版——38. 使用接口模拟可扩展的枚举

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. D3D游戏编程系列(四):自己动手编写即时战略游戏之网络同步

    说到网络同步,这真是一个网络游戏的重中之重,一个好的网络同步机制,可以让玩家的用户体验感飙升,至少,我玩过的魔兽争霸在网络同步方面做得非常好,即便是网络状况很不稳定,依然可以保证用户数据不会出现意想不 ...

  2. delphi 获取本机IP地址和MAC地址

    unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...

  3. css - 三种方法解决LI和内部Img的上下间距问题

    在火狐浏览器和谷歌浏览器(qq浏览器,谷歌内核)bug类似这张图: img的高度是190*127 但是放到li中,li并没有设置高度,却和内部的图片之间上下错位. 若强行给li设置高度127,他和im ...

  4. TextureMerger1.6.6 二:Sprite Sheet的制作和使用

    本随笔记录下Sprite Sheet的制作和使用 Sprite Sheet主要用于将零碎的小图合并成一张整图.减少加载图片时http的请求次数. 1 打开TextureMerger,选择Sprite ...

  5. Unity3D笔记十一 定制导航菜单栏

    一.定制导航栏 Unity导航菜单栏位于游戏引擎界面的顶部,其中有很多选项且含义各不相同.Unity为开发者提供了导航菜单栏的程序接口,使用代码可以动态添加菜单栏中的选项以及子项 using Unit ...

  6. SaltStack配置管理-状态间关系

    上一篇:SaltStack配置管理-LAMP状态设计 include包含 上篇安装LAMP环境是一个个环境安装,可以通过include模块全部安装 lamp.sls include: - apache ...

  7. QQ 空间过滤器 for V8

    最近 QQ空间升级到 V8 版本,做了很大的调整, 我也做了升级,由于时间关系,功能暂时只有 模块过滤,其他过滤请等待后续更新,谢谢大家的支持! 刚刚上线,不知道你们能否看到 https://chro ...

  8. oracle高水位问题

    转自:https://blog.csdn.net/cnham/article/details/5987999 说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我们知道,ORACLE在逻辑存 ...

  9. 新安装和已安装nginx如何添加未编译安装模块/补丁

    新安装和已安装nginx如何添加未编译安装模块/补丁 --http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10485& ...

  10. Underscore.js (1.7.0)-集合(Collections)(25)

    稽核函数(数组或对象) each_.each(list, iteratee, [context]) 别名: forEach 遍历list中的所有元素,按顺序用遍历输出每个元素.如果传递了context ...