用枚举实现单例

最近看同事的老代码有这么个类,一时之间真没看明白.找同事一解释才知道这使用枚举实现的一个单例.

忽然感觉就这么简单的单例就水平立马见高下.

public enum RedisPlugin implements Plugin {

INSTANCE;

public static RedisPlugin me() {
        return INSTANCE;
    }

}

于是我花了一上午才弄明白上面的代码究竟是什么意思.

Enum类是java.lang包中一个类,他是Java语言中所有枚举类型的公共基类。

源码中定义如下

public abstract class Enumextends Enum > implements Comparable,Serializable

这是个抽象类不能实例化,而且它还不可以被继承

enum Color{RED,BLUE,GREEN}

对这个枚举类进行反编译会得到如下类文件

public final class Color extends Enum<Color>{  

public static final Color[] values() { return (Color[])$VALUES.clone(); }  

public static Colorvalue Of(String name){ ... }  

private Color(String s,int i){

super(s, i); 

}  

public static final Color RED;  

public static final Color BLUE;  

public static final Color GREEN;  

privates tatic final Color $VALUES[];  

static {  

RED = new Color("RED",0);  

BLUE = new Color("BLUE",1);  

GREEN = new Color("GREEN",2);  

$VALUES = (new Color[] { RED, BLUE, GREEN });  

}

}

当我们使用enum关键字定义一个枚举的时候,他会帮我们在编译后默认继承java.lang.Enum类,而不像其他的类一样默认继承Object类。且采用enum声明后,该类会被编译器加上final声明,故该类是无法继承的。 PS:由于JVM类初始化是线程安全的,所以可以采用枚举类实现一个线程安全的单例模式。


枚举构造函数的作用以及使用

public enum Light {

   // 利用构造函数传参

   RED (1), GREEN (3), YELLOW (2);



   // 定义私有变量

   private int nCode ;



   // 构造函数,枚举类型只能为私有

   private Light( int _nCode) {

       this . nCode = _nCode;

   }



   @Override

   public String toString() {

       return String.valueOf ( this . nCode );

   }

} 

这里的RED(1)就是调用了构造函数。这个类主要的功能,是把枚举值输出。譬如RED的值到底是什么呢?通过构造函数RED(1),我们知道RED的值是1 。当然也可以是RED(“红灯”)这样的实现方式。Java貌似会默认提供1的值。


这次等级定为中上一部分原因是向高手致敬,那位老同事的技术水平的确可以排到中上了!


你可能感兴趣的:(中上篇,底层知识)