读Effective Java 有感

第一条:考虑用静态工厂代替构造器

优点:

第一:静态工厂方法可以突破构造函数不能自由命名的限制,对于不同的工厂方法可以采用不同的会意的名字,是程序具有更好的可读性。JAVA平台库的 java.text.Format的子类NumberFormat就有getInstance() , getPrecentInstance() , getCurrencyInstatnce()等静态方法,通过不同的名字产生特定的对象。

第二:返回原返回类型或原返回类型的子类型都可以,这样就加大了程序设计和使用的灵活行,如java.util集合框架就采用了这种优势,这样就可以更好达到封 装的目的,降低API的数目和用户的使用难度,java.util.Connections是集合框架的辅助类用于对原有的集合类进行进一步封装,产生一 些同步的集合,不可修改的视图。

第三:静态工厂方法所创建的对象可以在编译时不存在,动态创建对象,采用放射,类似SPRING的IOC容器方转。最典型的例子就是spi服务提供 者框架,Service Provider Iframe 是一种用于在运行时刻产生对象的框架,达到对象的创建与使用分离,是对象的客户和对象之间解耦,增加程序的灵活性和可扩展性。既然spi可以动态创建对象,那么采用什么机制来创建什么对象,创建对象的依据是什么了,spi必须一种统一的注册机制,对于要创建的对象,应该在XML文件中配置,到时候,只要 提供一个字符串,就可以凭借该字符串来创建配置的对象。简单实现如下:

 class SPITest{
 private static Map SPIMap = new HashMap();
 private void initSPIMapIfNeccury(){
 if(SPIMap == null){
 SPIMap = new HashMap();
 } 

 //initMap user the sepecify XML 

    //the map key is a beanName ,the value is a Object which config by XML
 }

 public Object getInstace(String beanName){
 Object result = null;
 try{
 if(SPIMap.containsKey(beanName)){
 result = SPIMap.get(beanName);
 } else{
 throw new Exception(" please config the xml file ,this bean is not exists!");
 }
 }catch(Exception exce){
 exce.printStackTrace();
 }

 return result;
 }
}可以明显看出待创建的对象具体创建哪个对象,在编译时并不知道,只有在运行时刻才知道,将对象的创建工作推迟到运行时,这即是优点,有是缺点,失去了编译检查的功能。

缺点:

第一:如果将要创建的对象的构造方法是私有的或是default的,就有可能不能创建该对象

第二:采用构造函数实例化对象,是语言的规范,而静态工厂方法与其他的静态方法没有区别,就增加了用户使用的区别。但这可以尽量采用一些家喻户晓的名字解决,让用户看到改名字就知道该方法是静态工厂方法。如getInstance()。

posted @ 2016-04-28 17:27  单链表  阅读(168)  评论(0编辑  收藏  举报