传统的实现单例模式的方式:
http://blog.csdn.net/uncle_gy/article/details/77962501
单例模式和多线程:
http://blog.csdn.net/uncle_gy/article/details/78470486
主体代码
class MyObject{
//这是具体的实现方法
}
class MyThread extends Thread{
@Override
public void run(){
System.out.println(Thread.currentThread()+" "+MyObject.getInstance().hashCode());
}
}
public class SingleMain{
public static void main(String[]args){
MyThread thread1=new MyThread();
MyThread thread2=new MyThread();
MyThread thread3=new MyThread();
thread1.start();
thread2.start();
thread3.start();
}
}
使用静态内部类实现
class MyObject{
private static class MyObjectHandler{
private static MyObject myObject=new MyObject();
}
private MyObject(){}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
运行结果:
使用static代码块实现
class MyObject{
public static MyObject myobject=null;
private MyObject(){}
static {
myobject=new MyObject();
}
public static MyObject getInstance(){
return myobject;
}
}
运行结果:
使用enum枚举类型实现
什么是枚举类型
下面的代码定义了3种颜色,包括颜色的编号和名称,
在枚举类中构造方法是私有的,不允许外界调用,在使用时自动调用,这符合单例模式的要求。
enum Color{
RED("red",0),ORANGE("orange",1),YELLOW("yellow",2);
private String name;
private int num;
private Color(String name,int num){
this.name=name;
this.num=num;
}
public String getName(){
return this.name;
}
public int getNum(){
return this.num;
}
}
public class MyEnum{
public static void main(String[] args){
System.out.println("颜色名称"+Color.RED.getName()+" 颜色编号"+Color.RED.getNum());
}
}
用枚举类实现单例模式
class MyObject{
}
class AssistantObject{
public enum MyEnumClass{
RealObject(new MyObject());
private MyObject myobject;
private MyEnumClass(MyObject myobject){
this.myobject=myobject;
}
public MyObject getInstance(){
return this.myobject;
}
}
public static MyObject getInstance(){
return MyEnumClass.RealObject.getInstance();
}
}
运行结果:
为什么枚举类型可以实现单例模式
枚举类型
枚举类型就是一些具有相同特性的类常量
java中类的定义使用class,枚举类的定义使用enum。在Java的字节码结构中,其实并没有枚举类型,枚举类型只是一个语法糖,在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum,并被final关键字修饰。
public enum Fruit {
APPLE,ORINGE
}
使用jad对编译后的class文件进行反编译后得到:
public final class Fruit extends Enum
{
public static Fruit[] values()
{
return (Fruit[])$VALUES.clone();
}
public static Fruit valueOf(String s)
{
return (Fruit)Enum.valueOf(Fruit, s);
}
private Fruit(String s, int i)
{
super(s, i);
}
//枚举类型常量
public static final Fruit APPLE;
public static final Fruit ORANGE;
private static final Fruit $VALUES[];//使用数组进行维护
static
{
APPLE = new Fruit("APPLE", 0);
ORANGE = new Fruit("ORANGE", 1);
$VALUES = (new Fruit[] {
APPLE, ORANGE
});
}
}
从这里可以看出,使用了枚举类型就相当于是使用static代码块实现。