effective java读书笔记

第二章 创建和销毁对象
本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,
如何确保它们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作
第一条 用静态工厂方法代替构造器
静态工厂方法与构造器不同的第一大优势在于,它们有名称。 见名知意
静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象, 返回同一个对象引用
静态工厂方法与构造器不同的第三大优势在子,它们可以返回原返回类型的任何子类型的对象, 子类的多态, 方法返回值类型为接口, 实际返回子类
静态工厂的第四大优势在于,所返回的对象的类可以随着每次调用而发生变化,这取
决于静态工厂方法的参数值, 通过ifelse返回当前参数要求的值
静态工厂的第五大优势在于,方法返回的对象所属的类,在编写包含该静态工厂方
法的类时可以不存在, Java spi, jdbc等

静态工厂方法的主要缺点在子类如果不含公有的或者受保护的构造器,就不能被子类化
静态工厂方法的第二个缺点在于,程序员很难发现它们, 所以要在方法命名上遵循

下面是静态工厂方法 一些惯用名称 里只列 出了 中的 小部分:
from一一类型转换方法,它只有单个参数,返回该类型的一个相对应的实例,例如:
Dated= Date.from(i 1stant) ;

of
聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,例如
Set faceCa ds
= EnumSet. of (JACK , QUEEN, KING];

valueOf一一比 from of 更烦琐的 种替代方法,例如
Bigintege me = Bigintege .valueOf(Intege .MAX_VALUE);

instance 或者 get Instance -返回的实例是通过方法的(如有)参数来描述
的,但是不能说与参数具有 同样的值,例如
StackWalke luke
= StackWalke .getinstance(options);

create 或者 new nstance一一才象 instance 或者 getinstaηce 样,但 create
或者 new stance 能够确保每次调用都返回一 新的实例 ,例如:

getType像getInstaηce 样,但是在工厂方法处于不同的类中的时-候使用Type表示工厂方法所返回的对象类型
例如:
FileSto fs = Files.getFileStore(path];

newType一像 newinstance一样,但是在工厂方法处于不同的类中的时候使用
Type 表示工厂方法所返回的对象类型,例如:
Buffe edReade 「= Files.newBuffe edReade path);

type-一-get ype new Type 的简版,例如:
List litany = Collections.list(legacylitany〕;
简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处
静态工厂经常更 合适,因此切忌第一反应就是提供公有的构造器, 不先考虑静态工厂
第二条 遇到多个构造器参数时要考虑使用构建器
使用建造者模式

当对象的参数既有必填又有非必填的时候,有三种方式来创建这个对象
重叠构造器, 提供多个可供选择的构造器
通过setting方式设置多个值
通过builder模式
Builder 模式也适用于类层次结构
简而言之 如果类的构造器或者静态工厂中具有多个参数,设计这种类时, Builde
模式就是一种不错的选择,

第三条 用私有构造器或者枚举类型强化 Singleton 属性
Singleton 通常被用来代表 个无状态的对象

需要将构造器私有化

防止通过反射访问对象的私有构造器
可以修改构造器,让它在被要求创建第二个实例的时候抛出异常

防止通过反序列化创建对象
提供一个 readResolve 方法
implements Serializable
private Object readReolve ()
Return INSTANCE; 直接返回单例对象

实现 Singleton 第三种方法是声明一个包含单个元素的枚举类型:
单元 枚举类型经常成为实现 Singlton 最佳方法
第四条 通过私有构造器强化不可实例化的能力
当有些类不希望被实例化或者子类化的时候
应该提供一个私有的构造器,并在构造器中抛出异常,
而不应该是设计成抽象类,不然会给人这个类需要被继承的感觉
第五条 优先考虑依赖注人来引用资源
当创一个新的实例时就将该资源传到构造器中这是依赖注入( dependency injection )的一种形式:

可以根据注入对象的不同,来生成不同的行为

比较类似组合模式,通过在构造器中注入接口类型, 在使用时注入具体类型, 通过多态的方式可以组织成不同的调用结果

可以采用依赖注入框架
第六条 避免创建不必要的对象
如果对象是不可变的( immutable (详见第 17 条),它就始终可以被重用

创建好自定义的对象池
第七条 消除过期的对象引用
第八条 避免使用终结方法和清除方法
终结方法 finalize

Java 9 中用清除方法( cleaner )代替了终结方法 清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的
第九条 try-with-resources 优先 try-finally
Java7引人 try with sources 语句时
要使用这个构造的资源,必须先实现 AutoCloseable 接口,
其中包含了单个返 void close 方法 Java 类库与第 方类库中的许多类和接口,现在都实现或扩展了AutoCloseable 接口 如果编写了 个类,它代表的是必须被关闭的资源,那么这个类也应该实现 AutoCloseable
第三章 对于所有对象都通用的方法
尽管 Object 是一个具体类,但设计它主要是为了扩展 它所有的非 final 方法(equals
hashCode oString clone finalize )都有明确的通用约定( general contract),
覆盖这些方法的时·候,都有责任遵守这些通用约定;如果不能做到这 点,其 依赖于这些约定的类(例如 HashMap HashSet )就无法结合该类 起正常运作
第十条 覆盖 equals 时请遵守通用约定
第十一条 覆盖 equals 时总要覆盖 hash Code
第十二条 始终要覆盖 toString
第十三条 谨慎覆盖 clone
第十四条 考虑实现 Comparable接口
第四章 类和接口
类和接口是 Java 编程语言的核心,它们也是java 语言的基本抽象单元 Java 语言提供
了许多强大的基本元素,供程序员用来设计类和接口 本章阐述的一些指导原则,可以帮助
你更好地利用这些元素,设计出更加有用 健壮和灵活的类和接口
第十五条 使类和成员的可访问性最小化
设计良好的组件会隐藏所有的实现细节,
这个概念被称为信息隐藏( info1mation ding )或封装
有效 解除组成系统 的各组件之 的藕合关系,即解耦
Java 提供了许多机制(facility )来协助信息隐藏 访问控制(access contro )机制
访问修饰符

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

在发行版本中如果把类做成公有的,你就有责任永远支持它,以保持兼容

如果一个类只被另一个类内部用到可以考虑私有内部类的方式,

字段不能是public的,防止在设置值的时候没有办法约束,必须通过方法去设置值

总而言之,应该始终尽可能(合理)地降低程序元素的可访问性
第十六条 要在公有类而非公有域中使用访问方法
如果类可以在它所在的包之外进行访问,就提供访问方法, 以保留将来改变该类的内部表示法的灵活性
如果公有类暴露了它的数据域 ,要想在将来改变其内部表示法是不可能的,因为公有类
客户端代码已经遍布各处了所以提供setter

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

public的类不应该暴漏public的属性
第十七条 使可变性最小化
不可变类是指其实例不能被修改的类 每个实例中包含的所有信息都必须在 建该实
例的时候就提供,并在对象的整个生命周期( lifetime )内固定不变

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

  1. 不要提供任何会改对状态的方法(也称为设值方法)
  2. 保证类不会扩展一般做法是声明这个类成为 final
  3. 声明所有的域都是final
  4. 声明所有的域都为私有的
  5. 确保对于任何可变组件的互斥访问

尽量使用不可变类,唯一缺点就是不同值需要不同对象
第六章 枚举和注解
Java 支持两种特殊用途的引用类型 一种是类的称作枚举类型( enum type
一种是接口,称作注解类型( annotation type 本章将讨论这两个新类型的最佳使用实践
第四十条 坚持使用Override注解
在你想要覆盖超类声明的方法中使用Override 注解
可以避免编译错误
第八章 方法
本章要讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为
方法编写文档 本章大部分内容既适用于构造器,也适用于普通的方法 与第四章一样,本
章的焦点也集中在可用性 健壮性和灵活性上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值