前言:因为是直接看完Think in Java后就入手Effective Java的,所以在阅读的过程中难免有些不懂,便以一种阅与查的方式很费劲的去尽量的多深入了解Java,希望在看完后能够有很大的提升,并将这一过程所获以笔记形式记下来
第一条的标题是考虑用静态工厂方法代替构造器,立马就有一个问题便是为什么要用静态工厂方法代替构造器,更浅显一点说什么是静态工厂方法,再进一步想到那么为什么要私有化对象呢?
下面从为什么要私有化对象讲起
私有化对象可以限制对象的个数,当然还有更多,从程序说吧
创建了一个私有化的构造函数的类
public class PrivateDemo {
private PrivateDemo(){}
public void print(){
System.out.println("Hello World!");
}
}
在一个类中去调用该类
public class Demo01 {
public static void main(String[] args) {
PrivateDemo demo;
demo=new PrivateDemo();
}
}
在demo=new PrivateDemo()这行报错:The constructor PrivateDemo() is not visible
表明私有化构造器的类是不能够new的
将上面两个类改变一下,如下:
第一个类中添加一个获取对象的方法
public class PrivateDemo {
private PrivateDemo(){}
public static PrivateDemo getInstance(){
return new PrivateDemo();
}
public void print(){
System.out.println("Hello World!");
}
}
第二个类通过调用该方法来实现实例化对象
public class Demo01 {
public static void main(String[] args) {
PrivateDemo demo;
demo=PrivateDemo.getInstance();
demo.print();
}
}
但是这样写之后给我的感觉是并不能看到私有化构造器后所带来的不同,对于这个问题姑且先当做等价处理
对第一个类继续改进,让私有化构造器的作用显得更突出,(因为私有化了构造器,要想调用类中的方法,必须使得类中的方法为static,通过类名进行调用)
public class PrivateDemo {
private static PrivateDemo demo=new PrivateDemo();
private PrivateDemo(){}
public static PrivateDemo getInstance(){
return demo;
}
public void print(){
System.out.println("Hello World!");
}
}
这样之后,在其它类中不管多少次调用getInstance(),返回的对象均是同一个,这便是单例设计
有这样的描述:Windows中的回收站,所有的盘都共享一个回收站,这便是一个典型的单态设计
对单态设计进一步了解,又分为饿汉式和懒汉式
饿汉式:先在类中new好对象,要调用的时候直接返回
懒汉式:在第一次调用的时候才实例化对象
下面是懒汉式的程序:
public class PrivateDemo {
private static PrivateDemo demo;
private PrivateDemo(){}
public static PrivateDemo getInstance(){
if(demo==null){
demo=new PrivateDemo();
}
return demo;
}
public void print(){
System.out.println("Hello World!");
}
}
当然私有化构造器的作用远不于此,与上相对,必不可少的要提到多例设计
即通过传入的参数不同,可返回不同的对象
代码如下:
public class PrivateDemo {
private static PrivateDemo demo1;
private static PrivateDemo demo2;
private PrivateDemo(){}
public static PrivateDemo getInstance(int t){
if(t==1){
if(demo1==null){
demo1=new PrivateDemo();
}
return demo1;
}else if(t==2){
if(demo2==null){
demo2=new PrivateDemo();
}
return demo2;
}else{
return null;
}
}
public void print(){
System.out.println("Hello World!");
}
}
通过传入的t值不同,便可以new两个对象
下一篇讲静态工厂
参考:
http://blog.csdn.net/chssheng2007/article/details/5900620