摘自Effective Java中文版
第2章
创建和销毁对象
第1条:考虑用静态工厂方法代替构造函数:
静态工厂方法的好处:
1.具有名字。如果构造函数没有确切地描述被返回的对象,那么选用适当名字的静态工厂可以是一个类易于使用,并且相应的客户代码更易于阅读。
2.静态构造方法每次被调用的时候,不要求非得创建一个新的对象。
3.可以返回一个原返回类型的子类型的对象。
服务提供者框架:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册(register)这些实现,以便用户能够使用它们。框架的客户直接使用API,无需关心自己到底在使用哪个实现。
静态工厂方法的缺点:
1.类如果不含公有的或者受保护的构造函数,就不能被子类化。
2.他们与其他的静态方法没有任何区别。
静态方法的名字:
valueOf—返回的实例与它的参数具有同样的值。使用这个名字的静态工程方法是一些非常有效的类型转换操作符。
getInstance—返回的实例算是由方法的参数来描述,但是不能够说与参数具有哦他那个样的值。
第2条:使用私有构造函数强化singleton属性
方法:
1. 提供公有的静态final域。
公有的静态域是final的,所以该域将总是包含相同的对象引用。
public class FinalField {
public static final FinalField ff = new FinalField();
private FinalField(){
}
}
|
2. 提供公有的静态工厂方法。
提供了灵活性
public class FinalMethod {
private static final FinalMethod fm = new FinalMethod();
private FinalMethod(){
}
public static FinalMethod getInstance(){
return fm;
}
}
|
为了使singleton类编程可序列化的(serializable),仅仅在声明中加入”implements Serializable”是不够的,为了维护singleton性,你必须也要提供一个readResolve方法。反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。本质上,该方法忽略了新建对象,仍然返回类初始化事创建的那个实例。否则的话,一个序列化的实例在每次反序列化的时候,都会导致创建一个新的实例。
private Object
readResolve() throws ObjectStreamException{
/**
* 返回那个真正的FinalMethod实例,让垃圾回收器
* 回收其他反序列化生成的实例
*/
return fm;
}
|
第3条:通过私有构造器强化不可实例化的能力。
通过将一个类做成抽象类来强制该类不可被实例化是行不通的。由于只有当一个类不包含显示的构造函数的时候,编译器才会生成默认构造函数,所以,我们只要让这个类包含单个显式的私有构造函数,则它就不可被实例化。
第4条:避免创建重复的对象
如果一个对象是非可变的,那么它总是可以被重用。
对于同时提供了静态工厂方法和构造函数的非可变类,你通常可以利用静态工厂方法而不是构造函数,以避免创建重复的对象。
适配器:它把功能委托给后面的一个对象,从而为后面的对象提供体格可选的接口。
第5条:消除过期的对象引用。
如果一个栈显示增长,然后在收缩,那么从栈中弹出来的对象不会被当作垃圾回收,即使使用栈的客户程序不再引用这些对象,他们也不会被回收。这是因为,栈内部维护者对这些对象的过期引用。
过期引用:是指永远也不会被解除的引用。
一般而言,只要一个类自己管理它的内存,程序员就应该警惕内存泄漏问题,一旦一个元素被释放掉,则该元素中包含的任何对象引用应该被清空。
内存泄漏的另一个常见来源是缓存。
第6条
避免使用终结函数。
终结函数并不能保证会被及时地执行,从一个对象变得不可到达开始,到它的终结函数被执行,这段事件的长度是任意的、不确定的。这意味着,事件关键的任务不应该由终结函数来完成。我们不应该依赖一个终结函数来更新关键性的永久状态。
正确的中止方式是提供一个显式的终止方法。显式的终止方法通常与try-finally结构结合起来使用,以确保及时中止。
终止函数的作用:
1.忘记调用显式终止函数,终结函数可以作为安全网,关闭相关资源(但不能保证及时)。
2.与对象的本地对等体有关。(因为本地对等体不是一个普通对象,所以垃圾回收期不会知道它),当普通对象被回收后,且本地对等体并不拥有关键资源,那么可以用终结函数调用显式的终止方法(本地方法或调用本地方法)。
本地对等体对象:本地对等体是一个本地对象,普通对象通过本地方法委托给一个本地对象。
终结函数链:(并不会被自动执行)如果一个类有一个终结函数,并且一个子类改写了终结函数,那么子类的和总结函数必须要手工调用超类的终结函数。
分享到:
相关推荐
### 第二章 创建和销毁对象 这一章深入探讨了对象的生命周期管理,包括: 1. **静态工厂方法**:相比构造器,静态工厂方法有优点如可以不返回新实例、允许返回同一实例(单例)、可以有更具选择性的访问控制,并且...
在 Java 中,创建和销毁对象是非常重要的。静态工厂方法可以代替构造器,提供了更多的灵活性和性能优势。静态工厂方法可以返回原类型的任何子类型,且可以将构建好的实例缓存起来,方便重复利用,不用每次调用都创建...
1. **第2章 创建和销毁对象** - 单例模式:讲解了如何正确实现单例类,避免多线程环境下的并发问题。 - 构造函数:强调构造函数应简洁,避免在构造过程中执行复杂操作。 - 工厂方法:介绍工厂方法模式,作为创建...
书中的一些关键知识点可能包括:理解对象的创建和销毁、接口设计、类设计、方法设计、泛型的使用、异常处理、并发编程、Java集合框架的使用和扩展等等。在学习这些内容时,读者将被引导深入理解Java语言的细节,并...
目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...
创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 12 - 序列化 第 2 章 - 创建和销毁对象 第 1 项 - 考虑静态工厂...
#### 第二章 创建/销毁对象 ##### 用静态工厂方法代替构造器 在面向对象编程中,对象的创建通常是通过构造器来完成的。然而,在某些情况下,使用静态工厂方法来创建对象可能会更加灵活和高效。 **静态工厂方法的...
创建和销毁对象 考虑使用静态工厂方法代替构造方法 优点: 有名字 每次调用的时候,不一定要创建新的对象 可以返回一个类型的子类型 Collections就是这种用法 返回对象的类可以随调用的不同而变化(用输入的参数值...
通过以上对“Effective Java 中文版 第二版”的核心知识点的总结,我们可以看到这本书覆盖了Java编程语言的各个方面,包括面向对象设计原则、类与接口的设计、对象的创建与销毁、枚举类型与注解、泛型与集合框架以及...
第2章对象的创建和销毁 项目编号 标题 副标题 经理 项目1 项目2 项目3 项目4 项目5 不要直接指定资源,请使用依赖对象注入 莉娜 项目6 避免不必要的对象创建 德玛 项目7 释放使用的对象参考 莉娜 项目8 避免使用...
2. **类与对象**:Java是一种面向对象的语言,理解类的定义、对象的创建与销毁、封装、继承、多态等概念至关重要。同时,深入探讨构造函数、访问修饰符、抽象类与接口的应用。 3. **异常处理**:Java中的try-catch-...
创建和销毁对象 1.使用静态工厂方法而不是构造函数 好处 与构造函数不同,它们有名称 与构造函数不同,它们不需要在每次调用时都创建一个新对象 与构造函数不同,它们可以返回其返回类型的任何子类型的对象 它们减少...
这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的...
- **线程池**:通过管理一组预先创建好的线程来提高性能,避免频繁创建和销毁线程的开销。 - **不可变对象**:使用不可变对象可以避免并发修改问题,因为一旦创建后其状态就不能改变。 #### 七、本书内容概览 第一...
final、finally、finalize三者区别:final用于声明常量,finally用在try-catch-finally语句中表示必须执行的代码块,finalize是Object类的一个方法,垃圾回收器在销毁对象之前会调用它。 Io流的层次结构:Java中Io...
优点:节约系统资源,对于频繁使用的对象,可以省去创建和销毁对象所花费的时间;控制实例数目,对某些需要频繁创建和销毁的对象,使用单例模式可以提高系统性能;当想实例化一个类时,类已经实例化过了,就可以直接...
1. 节省内存:对于只需要一个实例的对象,可以避免频繁创建和销毁对象带来的内存消耗。 2. 提高效率:全局唯一的实例,减少对象间的交互复杂性。 3. 控制实例化过程:可以控制实例化过程,如初始化资源、设置默认值...