Think in java

来源:互联网 发布:激光打标机做图软件 编辑:程序博客网 时间:2024/05/21 22:56

文章取自英文版的think in java中的重要段落。

因为发现中文版的某些地方删减了,所以有能力还是自己看英文版比较好

Item 1:Consider static factory methods instead of constructors

使用静态工厂来代替构造器(有利也有弊)

advantage

-1. only advantage of static factory methods is that,unlike constructors,they have names
静态工程相比构造器的好处是他有自己的名字。

解析:因为一个类的构造器只有一个签名,当存在多个构造器的时候,程序员必须知道参数的实际类型和情况才能得意区分,这并不是一个很好的主意。所以使用静态方法可以明确的通过名字来可知这个方法返回什么对象,需要什么参数。

-2. A second advantage of static factory methods is that,unlike constructors they are not required to create a new object each time they’re invoked
静态工厂方法并不要求像构造器一样每次被调用的时候都创建一个新的对象。

解析:这里书中给出的解释是,允许不可变类(immutable class
线程安全)预先创建一个对象或者缓存一个,以避免创建重复不必要的对象(对于创建一个对象需要花费大量资源时候尤其可用)。这样有效的控制对象,可以确保此类是单例或者不可实例化类,同时由于不可变类不可能存在两个对象,所以两次对于这个类取得的对象a,b可以不用equals进行比较而直接调用a==b符号来进行相等判断提升性能。以下给出代码事例

    /**不好意思用了一个单例模式来解释,但是这个是比较有说服力的,用的也比较多       小贴士:单例的破解方法            1. 一是通过反射来设置private为可见。            2. 二是通过让对应类实现可序列化接口来通过序列化生成对象。*/    public class ClassStaticFactory {        private static ClassStaticFactory classStaticFactory;        private ClassStaticFactory(){        }        public static ClassStaticFactory getInstance(){            if(classStaticFactory==null){                classStaticFactory = new ClassStaticFactory();            }            return classStaticFactory;        }    }    //之前我一直觉得通过类似构造器也能实现此功能,但是在尝试了一番后,发现暂时不可能,希望有小伙伴可以贴出自己代码。经过多次反复实验,发现并不能在构造器中判断自己对象是否存在,所以此结论是正确的

BTW:枚举类就是基于jvm底层实现的天然的单例

-3. A third advantage of static factory methods is that,unlike constructors,they can return an object of any subtype of their return type.
第三点优势是静态工厂方法,可以返回该对象的任何子类型对象.(并且此类不需要一定声明为public)

解析:这里会涉及到多态,并且此时对于你选择返回想要对象类型有着极大的延展性。这里书中提到了interface_based frameworks基于接口的框架
例:此框架提供一个接口,此接口有多个实现类,外部者在使用此接口的方法的时候可以随时切换调用此接口的多个实现类,而内部如何实现,他不用关心。由于我们知道接口不能的方法不能被static和 final或者public以外的任何字段修饰,所以为了方便,静态工程方法就是一种很好的实现.

静态方法还可以返回天然的接口类型,因为接口是不能有静态方法的,所以为了方便操作,通过一个不可实例化类(一般是工具类)的静态方法返回多种接口类型。下面举例贴出来代码

Class Types{    static TypeA getTypeA(){//在不可实例化中的静态方法实现        return TypeAImplement();    }    static TypeB getTypeB(){        return TypeBImplment();    }    /**人们在意的只是TypeC,而不是关心它内部的具体实现*/    static TypeC getTypeC(int size){         if(size<32){            return SmallTypeCImplement();        }else if(64>size>32){            return BigTypeCImplement();        }else{            return HBigTypeCImplement();        }    }}interface TypeA{/**内部假如有个返回A类型的方法*/}interface TypeB{/**内部假如有个返回B类型的方法*/}interface TypeC{/**内部假如有个返回C类型的方法*/}//差不多就是这种感觉

文章举出了例子是Collections框架,它拥有32个实现类实现了这个接口,提供了各种类型容器,比如unmodifiable或者synchronize的,但是几乎所有的实现类在一个不可实例化类中的静态方法来输出对象的,这些类的返回对象都不是public的.这里建议大家去看看api文档,揣摩一下。

原创粉丝点击