在Java中有很多需要单例(Singleton)的场合,来保证其只被创建一次。先来看看2种在JDK1.5之前的2种实现方法,然后再看一种JDK1.5及以后才可以用的实现方法。
[list=1]
[*]声明constructor为private,然后将该单例对象声明为public的。
其中由于constructor是private的,所以不能直接由别的类来调用,只能由本类的内部调用。由于上面的static的对象的关系,这个constructor就只会被调用一次,成功地实现了单例。
这个用法其实不是很常见。它的好处是,作为一个public的属性对象,它可以被声明为final保证了其内容不被修改。作为一个声明而言,非常利于理解。
[*]声明constructor为private,然后该单例对象也声明为private,然后再加一个public的getInstance方法。
这个就是我们最常见的方法了。而且因为使用了一个method来返回,在自由度上能够大上许多,甚至可以返回其子类的实例。在多线程的时候也可以加以改进。
[*]最后这种方法就要用到jdk1.5才开始引入的enum了。
简单的enum的用法,就和c++一样。
然后直接可以使用Grade.A之类的来使用。但是,其实enum和class在内部的实现上还有有一些类似的(具体尚未深究,看看TIJ4应该会有收获,好多页啊)。
最简单的,是个可以在里面加一个method!
这样,连constructor都可以不要了。
据说这是最好的一种方法,直接能够防止多重访问等等。
这是我从来没有使用过的方法,以后有机会要试试。
[/list]
[list=1]
[*]声明constructor为private,然后将该单例对象声明为public的。
// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void method2use() {...}
}
其中由于constructor是private的,所以不能直接由别的类来调用,只能由本类的内部调用。由于上面的static的对象的关系,这个constructor就只会被调用一次,成功地实现了单例。
这个用法其实不是很常见。它的好处是,作为一个public的属性对象,它可以被声明为final保证了其内容不被修改。作为一个声明而言,非常利于理解。
[*]声明constructor为private,然后该单例对象也声明为private,然后再加一个public的getInstance方法。
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void method2use() {...}
}
这个就是我们最常见的方法了。而且因为使用了一个method来返回,在自由度上能够大上许多,甚至可以返回其子类的实例。在多线程的时候也可以加以改进。
[*]最后这种方法就要用到jdk1.5才开始引入的enum了。
简单的enum的用法,就和c++一样。
public enum Grade { A, B, C, D, F, INCOMPLETE };
然后直接可以使用Grade.A之类的来使用。但是,其实enum和class在内部的实现上还有有一些类似的(具体尚未深究,看看TIJ4应该会有收获,好多页啊)。
最简单的,是个可以在里面加一个method!
public enum Elvis {
INSTANCE;
public void method2use() { ... }
}
这样,连constructor都可以不要了。
据说这是最好的一种方法,直接能够防止多重访问等等。
这是我从来没有使用过的方法,以后有机会要试试。
[/list]