数据加载中……
《Effective java》学习笔记1

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

Tips:这里的静态工厂方法非设计模式的静态工厂方法

1、相对构造器的优势:

1.1、静态工厂方法有名称:

因为构造器只能有一个特定的签名,所以要提供多个构造器必须要通过参数列表的顺序上不同来实现,这样要求用户记住各种构造器,如果没有相关文档,容易出现错误。(eclipse中有自动检测功能,不过从语言的角度这样还是有问题的)而对于静态工厂方法,当一个类需要多个带有相同标签名得构造器时,就用静态工厂方法代替构造器,并慎重的选择名称以便突出它们之间的区别

1.2、不用每次调用的时候都新建一个对象

Java中创建对象的成本是非常大的,因此使用静态工厂方法的同时,可以预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,避免创建不必要的对象。

Such as :Boolean.valueOf(),永远不创建对象

Public static Boolean valueOf(Boolean b) {

           Return b ? Boolean.TRUE : Boolean.FALSE;

}

Ps:我们自己写程序的时候,可以通过enum来控制类在某个时刻那些实例存在。这些类被称为实例受控的类。

1.3、可以返回返回原类型的任何子类型的对象

1.3.1、这里将类得子类进行隐藏,通过API返回对象,同时又不会使对象的类变成共有。同时这也为针对接口编程提供了便利。因为接口不能有静态方法(静态方法属于类所拥有),则将接口Types中的静态工厂方法被放在一个名为Types的不可实例化的类中。

API中实现就是CollecionCollections

Collectionjava中的集合类的接口,它提供了集合类所共有的方法

Collections是由Collection上进行操作或返回Collection的静态方法组成。例如它提供了不可修改的集合,同步集合等。通过这种方式比导出32个独立公有类得实现方式要小得多。

1.3.2、公有的静态工厂方法所返回的对象的类不仅可以是非公有的,而且该类还可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。

API中实现是 EnumSet

书中说:如果它的元素有64个或者更少,静态工厂方法就返回了一个RegalarEnumSet实例,用单个long支持;如果枚举类型有65个或者更多的元素,工厂就返回JumboEnumSet类型,用long数组进行支持。

Ps:查阅了下jdk api没有找到相关的内容。不过理解上没什么难度,根据传入参数的量。底层动态选择实现的方式而已。

1.3.3、静态工厂方法返回的对象所属的累,在编写该静态工厂方法的类时可以不必存在。

服务者框架:多个服务提供者实现了一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来。

服务提供者框架三个重要的组件:

服务接口(Service Interface):提供者实现的;

提供者注册的API(provider Registration API),系统用来注册实现的,让客户端返回它们的

服务访问API(Service Registration API),客户端用来获取服务的实例的。

API中实现是JDBC的服务

每个db提供自己的*.Jar包来实现DB的操作即Driver,它们遵从一套标准。这就是服务接口

JDK中提供的DriverManagere.registerDriver是提供者注册的API,

DriverManager.getConnection()是服务访问API.

Ps:如果对这一部分不是很理解的话,强烈推荐原书中P7code…一看就明白了

1.4、在创建参数化类型实例的时候,它们使代码变得更加简洁

这里面主要提到的是类型推导(type reference)。所谓类型推导,即根据你定义的返回对象的类型来推导实例化的类型(个人感觉虽然很方便,有点不靠谱啊)

书中给的代码实例如下:

Public static <K,V> HashMap<K, V> newInstance() {

           return new HashMap<K, V>();

}

   Map<Strinng, List<String>> m = HashMap.newInstance();

2、静态工厂的缺点

   2.1、类如果不含公有的或者受保护的构造器,就不能被子类化。

       这里的主要原因就是,子类的方法的范围权限比父类更严格。书中也提到了,这其实是个优点。因为组合比继承更应该用。

   2.2、和其他静态方法实际上没有任何区别。

       这个纯粹是从java doc方便查询的角度来说的,so I don’t care it

posted on 2011-04-30 09:58 潘潘.eagle 阅读(306) 评论(0)  编辑  收藏 所属分类: JAVA


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问