一、使类和成员的可访问性最小化

  1、尽可能地使每个类或者成员不被外界访问。

  2、实例域决不能是共有的。包含公有可变域的类不是线程安全的。

  3、除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且确保公有静态final域所引用的对象不可变。

二、在公有类中使用访问方法而非公有域

  1、如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误。

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

三、使可变性最小化

  不可变的类是指其实例不能被修改的类。为使类不可变,需要遵循以下五条规则

  1、不要提供任何会修改对象状态的方法

  2、保证类不会被扩展

  3、使所有的域都成为私有的

  4、使所有的域都成为final的

  5、确保对于任何可变组件的互斥访问

  不可变对象本质上是线程安全的,他们不要求同步。

  如果不可变类实现Serializable接口,并且包含指向可变对象的域,必须提供显式的readObject或者readResolve方法。

  尽可能地限制类的可变性,除非有理由把域变成非final的,或者要使每个域都是final的。

四、复合优先于继承

  1、继承打破了封装性

  2、只有当子类真正是超类的子类新时,才是和用继承。

  3、使用继承会把超类API中的所有缺陷传播到子类中,而复合则允许设计新的API来隐藏这些缺陷。

五、要么为了继承而设计,并提供文档说明,要么就禁止继承

  1、注意父类中各方法之间的相互调用,特别是可被覆盖的方法。一定要在文档中说明其自用性。

  2、类必须提供适当的钩子,以便能进入到它的内部工作流程中。可以是受保护的方法,也可以是受保护的域。

  3、对于为了继承而设计的类,唯一的测试方法就是编写子类。经验表明,三个子类通常可以测试一个可扩展的类。

  4、构造器、静态工厂方法和其他具有构造对象功能的方法决不能调用可被覆盖的方法。

  5、为了继承而设计类的时候,Cloneable和Serializable接口出现了特殊的困难。

  6、通过完全消除类中的可覆盖方法的自用特性,也可以创建”能够安全地进行子类化“的类。

六、接口优于抽象类

  抽象类本质上类,接受类只能单继承的约束。这是其与接口的最大区别。接口的优势有:

  1、现有的类可以很容易地进行更新,以实现新的接口。

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

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

  4、接口可以安全地增强类的功能。

  5、通过为重要的接口提供一个抽象的骨架实现,把接口和抽象类的优点结合起来了。

  抽象类来定义允许多个实现的类型,与接口相比有一个明显的优势:抽象类的演变比接口的演变要容易的多。

七、接口只用于定义类型

  1、常量接口模式是对接口的不良使用。

八、类层次结构优于标签类

  1、标签类过于冗长、容易出错,并且效率低下。

九、用函数对象表示策略

  1、利用对象引用实现函数指针的功能,可以实现策略模式。

十、优先考虑静态成员类

  1、非静态成员类的每个实例都隐含着与外围类的一个外围实例想关联。在其被创建时,关联关系也建立了,这个关系不能被修改了。

  

Effective Java 读书笔记之三 类和接口的更多相关文章

  1. 《Effective Java》读书笔记 - 4.类和接口

    Chapter 4 Classes and Interfaces Item 13: Minimize the accessibility of classes and members 一个好的模块设计 ...

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

    1.使类和成员的可访问性最小化不指定访问级别,就是包私有.protected = 包私有 + 子类一般private不会被访问到,如果实现了Serializable,可能会泄露.反射.final集合或 ...

  3. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  4. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  5. 《Effective Java》笔记 使类和成员的可访问性最小化

    类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...

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

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

  7. 初读"Thinking in Java"读书笔记之第九章 --- 接口

    抽象类和抽象方法 abstract void f();抽象方法是仅有声明而没有方法体的方法. 包含抽象方法的类叫做抽象类,如果一个类包含了一个抽象方法,则该类必须限定为抽象类. 抽象类和抽象方法可以使 ...

  8. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  9. Effective Java 读书笔记

    创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时 ...

随机推荐

  1. Python实现打印二叉树某一层的所有节点

    不多说,直接贴程序,如下所示 # -*- coding: utf-8 -*- # 定义二叉树节点类 class TreeNode(object): def __init__(self,data=0,l ...

  2. 用css进行布局

     用css进行布局 一,开始布局的注意事项 1.作为最佳实践,应把html(内容)和css(显示)分离: 2.网站设计主要有两大类型:固定宽度(基于像素)和响应式(也称流式,使用百分数定义) 二,构建 ...

  3. Nginx+PHP-fpm高负载优化及压力测试方法

    Nginx+PHP-fpm组合,以内存占用小,负载能力强壮的特点,成为小内存VPS建站的首选组合.我们一起来探讨一下nginx+php-fpm高负载的优化方法. 先来看看nginx配置参数的优化.ng ...

  4. Android中怎么用this

    在JAVA程序中似乎经常见到“this”,自己也偶尔用到它,但是到底“this”该怎么用,却心中无数!很多人一提起它,就说“当前对象”,可到底什么是当前对象,是什么当前对象,他自己也不清楚.现在让大家 ...

  5. JS中的 公有变量、私有变量 !

    公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变 ...

  6. Autofac IContainer 测试

    using Autofac; using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  7. Python开发【第八篇】:网络编程 Socket

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  8. 两种html幻灯片效果

    650) this.width=650;" src="http://img1.51cto.com/attachment/201307/165757318.jpg" tit ...

  9. redis使用watch完成秒杀抢购功能(转)

    redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...

  10. 总结Spring、Hibernate、Struts2官网下载jar文件

    一直以来只知道搭SSH需要jar文件,作为学习的目的,最好的做法是自己亲自动手去官网下.不过官网都是英文,没耐心一般很难找到下载入口,更何 况版本的变化也导致不同版本jar文件有些不一样,让新手很容易 ...