最近看同事的老代码有这么个类,一时之间真没看明白.找同事一解释才知道这使用枚举实现的一个单例.
忽然感觉就这么简单的单例就水平立马见高下.
public enum RedisPlugin implements Plugin {
INSTANCE;
public static RedisPlugin me() {
return INSTANCE;
}
}
于是我花了一上午才弄明白上面的代码究竟是什么意思.
Enum类是java.lang包中一个类,他是Java语言中所有枚举类型的公共基类。
源码中定义如下
public abstract class Enum
这是个抽象类不能实例化,而且它还不可以被继承
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的值。
这次等级定为中上一部分原因是向高手致敬,那位老同事的技术水平的确可以排到中上了!