《EffectiveJava》读后感(第2章创建和销毁对象 第1条)

考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它自身的一个实例,最常用的方法就是提供一个共有的构造器。还有一种方法,类可以提供一个共有的静态方法,它只返回类的实例的静态方法。下面就是Boolean的简单示例。这个方法将boolean基本类型转换为Boolean对象:

public static Boolean valueOf(boolean b){
	return b ? Boolean.TRUE : Boolean.FALSE;
}

注意:静态方法和设计模式中的工厂方法模式不同,这里的静态方法和设计模式工厂方法并不直接对应。

静态方法四大优势:

一、静态工厂方法拥有名称,命名的好处在于使用者可以在没有文档的帮助下使用依旧可以清晰的使用。一个类只能拥有指定签名的构造器,通过编程虽然可以避开这个限制,但是在使用的时候如果没有文档的帮助是很困难的事情。
二、不必在每次调用他们的时候都创建一个新的对象,避免了经常请求创建相同的对象导致性能的消耗,这项技术可以极大的提升性能。
可以确保类是一个singlton或者不可实例化的,这样的好处是确保不会存在两个相等实例。即客户端可以用==来代替equals方法,这样也可以提升性能。而枚举类型保证了这一点。
三、可返回原返回类型的任何子类型的对象,极大的增加了灵活性。
Java Collection Framework的集合接口有32个便利实现,分别提供了不可修改的集合,同步集合等。几乎都是通过静态工厂在一个不可实例化类中导出。所有的返回对象都是非公有的。
四、在创建参数化类型实例的时候,它们是代码变得更简洁。遗憾的是,在调用参数化类的构造器时,即使类型参数很明显,也必须指明,例:

map<String, List<String>> m = 
new HashMap<String, List<String>>;

上面例子并不复杂,不过随着类型参数变得越来越长,越来越复杂,这种代码就非常的痛苦并且难以阅读。可通过静态工厂方法,编译器就可以替你找到类型参数。这被称为类型推导(type inference)。上面的代码可改为:

public static <k, v> HashMap<k, v> newInstance(){
	return new HashMap<k, v>();
}

声明就可以简化为:

map<String, List<String>> m = HashMap.newInstance();
静态工厂方法的2个缺点:

一、类如果不含公有的或者受保护的构造器,就不能被子类化。对于静态工厂的返回类也是同样如此,想将Collections的任何实现子类化是不可能的。但是程序设计语言鼓励使用复合而非继承(第16条)。
二、它与其它静态方法没有实质上的区别。javadoc的帮助,以及接口注释中关注静态工厂并遵守命名规范,可以弥补一下。常见静态工厂的命名:valueOf、of、fetInstance、newInstance、getType、newType。

总结:静态工厂方法和公有构造器各有用处,我们需要理解他们的好处,并在适宜的时机去使用它们。通常来讲静态工厂方法更加的合适,所以在使用的时候可以优先考虑静态工厂方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值