effective java-创建销毁对象

第一条 考虑用静态工厂方法代替构造器https://www.jianshu.com/p/ceb5ec8f1174

注意:静态工厂方法与设计模式中的工厂方法模式不同

静态工厂方法有以下几大优势:

  1. 它们有名称(当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器)
  2. 不必在每次调用的时候都要创建一个对象(这种情况下可以减伤创建不必要对象的开销,单例模式大多通过静态工厂方法实现)
  3. 可以返回原返回类型的任何子类型的对象
  4. 在创建参数化类型实例的时候,它们使代码变得更加简洁

静态工厂方法的缺点:

  1. 类如果不含公共的或者含保护的构造器,就不能被子类化。
  2. 它们与其他静态的方法实际上没有任何区别(要想查明如何实例化一个类有些困难)

第二条 遇到多个构造器参数时要考虑用构建器

第三条 用私有构造器或者枚举类型强化Singleton属性

在JDK1.5之前,实现Singleton由两种方法,这两种方法都要把构造器保持为私有的,并导出共有的静态成员,以便允许客户端能够访问该类的唯一实例

第一种方法中,将公有静态成员是一个final域,私有构造器仅被调用一次,弊端是,通过反射机制可以调用私有构造器

第二种方法中,公有的成员是个静态工厂(第一条), 弊端同上

第三种方法只需要编写一个包含单个元素的枚举类型,可以提供序列化机制,防止多次实例化,这种方法已经成为实现单例的最佳方法

第四条 通过私有构造器强化不可实例化的能力

企图将类做成抽象类来强化该类不能被实例化,这是行不通的,该类可以被子类化,并且该子类也可以被实例化。

由于只有当类不包含显式的构造器时,编译器才会生成缺省的构造器,因此我们只要让这个类包含私有构造器,它就不能被实例化了。

弊端:它使得一个类不能被子类化,所有的构造器都必须显示地调用超类构造器,子类就没有可访问的超类构造器可以调用了

第五条 避免创建不必要的对象

一般来说最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。如果对象时不可变的,它就始终可以被重用。

什么是不可变对象呢?简单解释就是用final修饰的对象,对象中所有的公共属性都是final的,如String,Integer封装类型都是不可变对象。

反例:

String s = new String("tiffany");

该语句每次执行的时候都会创建一个新的String实例,这样会造成创建不必要的String实例,修改如下

String s = "tifffany";

这样的话,只要他们包含相同的字符串字面量该对象就会被重用,此处引用一个==和equals的例子

https://mp.csdn.net/postedit

猜你喜欢

转载自blog.csdn.net/wo8vqj68/article/details/83684032