java的枚举真的很有意思。原本在C#里简简单单的事情,在JAVA里面搞得那么复杂。
下面是一个枚举定义:
package com.monkey.zjfwpt.modules.hyjj.entity;
public enum ENormal {
FZXZ (1),ZDXM(2),CLOUD(4);
private final int value;
private ENormal(int value) {
this.value = value;
}
public ENormal valueOf(int value) {
switch (value) {
case 1:
return ENormal.FZXZ;
case 2:
return ENormal.ZDXM;
default:
return null;
}
}
public int value() {
return this.value;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
这哪是什么枚举,就是一个类啊。而且还有点莫名其妙。本来也可以最简单的:
public enum ENormal {
FZXZ,ZDXM,CLOUD;
}
- 1
- 2
- 3
之所以要像第一个例子那样写一大坨,就是为了类型转换。像本例,枚举ENormal实际上是一个整型,但在java中,不能这样写:
int en = (int)ENormal.FZXZ;
- 1
要这样:
int en = ENormal.FZXZ.value();
- 1
为了这个value()
,就是我们写一大坨的原因。
当然啦,如果是采用最简单的方式
public enum ENormal {
FZXZ,ZDXM,CLOUD;
}
- 1
- 2
- 3
也不是不行,但我们只能通过读枚举元素下标(序号)的方式来获得整型值:
int en = ENormal.ordinal();
- 1
从0开始吧好像。不过这样有个风险,就是万一中途插入一个新的枚举元素,岂不乱套了。
============================================
2022.08.26
java枚举里的对象,似乎天然是枚举这个类的实例,可以调用枚举类里的方法?可以利用这点来实现单例模式。单例模式可以分为饿汉模式、懒汉模式、枚举模式、双重检查锁模式,等等,等等等等,我还是头一次听说,头都大了。
参考文章:
为什么用枚举类来实现单例模式越来越流行?
public class SingletonObject7 {
private SingletonObject7(){
}
/**
* 枚举类型是线程安全的,并且只会装载一次
*/
private enum Singleton{
INSTANCE;
private final SingletonObject7 instance;
Singleton(){
instance = new SingletonObject7();
}
private SingletonObject7 getInstance(){
return instance;
}
}
public static SingletonObject7 getInstance(){
/*
自始至终,枚举类Singleton里都只是声明了一下INSTANCE,之后一直没有然后
但在这里,忽然又可以通过它调用里面的getInstance
我对java的语法还是不太了解
*/
return Singleton.INSTANCE.getInstance();//看看 <!------------------
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30