Effective Java

Effective Java

创建和销毁对象

静态工厂方法代替构造器的优势

  • 可命名名称。一个类只有一个指定签名的构造器,但可以通过改变参数列表中参数顺序的不同,提供不同的构造器。但是会调用错误的构造器。静态工厂方法有名称,以区别于一个类中需要多个带有相同签名的构造器。
  • 不必创建新的对象。为重复的调用返回相同的对象。实例受控的类严格控制某个时刻哪些实例应该存在。使得不可变的类确保不会存在两个相等的实例。
  • 返回原类型的任何子类型的对象。API可以返回对象,不会使得对象的类变成公有的。这项技术适用于基于接口的框架,接口中不可有静态方法。接口中的方法默认为抽象方法。抽象方法存在于抽象类中,抽象方法必须被override,而静态方法不能被override,这是由于静态方法在类初始化时就已经加载在静态存储区。
    • 静态工厂方法返回对象所属的类,在编写包含该静态工厂方法的类时可以不必存在。这就构成了服务提供者框架(Servie Provider Framework)。三个重要的组件:服务接口,提供者注册API,服务访问API和可选的服务提供者接口。
  • 创建参数化类型实例的时候,使得代码变得更加简洁。静态工厂方法,编译器可以找到类型参数。这就被称作类型推导。Java8中已经支持。

静态工厂方法的缺点

  • 类如果不含公有的或者受保护的构造器,就不能被子类化。
  • 与其他静态方法没有任何区别。

遇到多个构造器参数时考虑用构建器

如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式是不错的选择。

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

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

避免创建不必要的对象

  • 小对象的构造器只做很少量的显式工作,小对象的创建和回收动作是非常廉价的。通过维护自己的对象池来避免创建对象,除非对象是非常重量级的。例如数据库连接池。

消除过期的对象引用

  • Stack类自己管理内存。存储池包含了elements数组的元素,对象引用单元。数组活动区域中的元素是已分配的,而数组其余部分的元素则是自由的。但回收器并不知道这一点。因此程序员将非活动部分的情况告诉垃圾回收器,手工清空这些数组元素。
  • 内存泄露的另一个常见来源是缓存。在缓存之外存在对某个项的键的引用,该项有意义。那么就可以用WeakHashMap代表缓存,当缓存中的项过期口,就会被自动删除。只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,WeakHashMap才是有用的。
  • 内存泄露的第三个常见来源是监听器和其他回调。确保回调立即被当做垃圾回收的最佳方法是只保存它们的弱引用,只将它们保存成WeakHashMap中的键。

避免使用终结(finalizer)方法

  • 终结方法并不能被保证一定会执行,使用终结方法有非常严重的Server性能损失。
  • 显式的终止方式通常与try-finally结合起来使用,以确保及时终止。
try{

}finally{

}

终结方法的两种合法用途。第一种用途:对象的所有者忘记调用前面段落中建议的显式终止方法时,终结方法可以充当安全网。第二种合理用途与对象的本地对等体(native peer)。本地对等体是一个本地对象,普通对象通过本地方法委托给一个本地对象。如果本地对等体拥有必须被及时终止的资源,那么该类就应该具有一个显式的终止方法,终止方法可以使本地方法,也可以调用本地方法。

终结方法链并不会自动执行。如果类有终结方法,并且子类覆盖了终结方法,子类的终结方法就必须手工调用超类的终结方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值