博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java enum类
阅读量:6689 次
发布时间:2019-06-25

本文共 2586 字,大约阅读时间需要 8 分钟。

1、可以在enum中添加变量和方法

先来看一段代码示例:

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
31
32
33
34
35
36
37
38
39
public
enum
State {
    
Normal(
"正常态"
,
1
), Update(
"已更新"
,
2
), Deleted(
"已删除"
,
3
), Fired(
"已屏蔽"
,
4
);
    
// 成员变量
    
private
String name;
    
private
int
index;
 
    
// 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化
    
private
State(String name,
int
index) {
      
this
.name = name;
      
this
.index = index;
    
}
 
    
// 普通方法
    
public
static
String getName(
int
index) {
      
for
(State c : State .values()) {
        
if
(c.getIndex() == index) {
          
return
c.name;
        
}
      
}
      
return
null
;
    
}
 
    
// get set 方法
    
public
String getName() {
      
return
name;
    
}
 
    
public
void
setName(String name) {
      
this
.name = name;
    
}
 
    
public
int
getIndex() {
      
return
index;
    
}
 
    
public
void
setIndex(
int
index) {
      
this
.index = index;
    
}
  
}

从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。

2、可以用来定义常量

先来回顾一下Java中如何定义常量吧,看下面一段代码:

1
2
public
static
final
int
normalState =
1
;
private
static
final
int
updateState =
2
;

下面我们还可以用enum枚举来代替上面的常量定义,代码如下:

1
2
3
public
enum
State {
 
Normal, Update, Deleted, Fired
}

在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。

3、在enum中实现接口

先来看下面一段代码:

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
public
interface
ICanReadState {
    
void
read();
 
    
String getState();
}
 
  
public
enum
State
implements
ICanReadState {
    
Normal(
"正常态"
,
1
), Update(
"已更新"
,
2
), Deleted(
"已删除"
,
3
), Fired(
"已屏蔽"
,
4
);
 
    
private
String name;
    
private
int
index;
 
    
private
State(String name,
int
index) {
      
this
.name = name;
      
this
.index = index;
    
}
 
    
// 接口方法1
 
    
@Override
    
public
String getState() {
      
return
this
.name;
    
}
 
    
// 接口方法2
    
@Override
    
public
void
read() {
      
System.out.println(
this
.index +
":"
+
this
.name);
    
}
  
}

和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。

实例

我们先定义个简单枚举(这里只是个例子,就简单定义3个变量了):

1
2
3
4
5
6
public
enum
SqlTypeEnum {
  
INSERT ,
  
UPDATE ,
  
DELETE ,
  
SELECT
}

此时解析SQL后,获取出来一个token,我们要获取这个token的枚举怎么获取呢?

这样获取:

1
2
String token =
"select"
;
SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf(token.toUpperCase());

如果没获取到,java会抛出一个异常哦:IllegalArgumentException No enum const class SqlTypeEnum.XXX

我做大写处理的原因是因为枚举也是大写的(当然如果你的枚举是小写的,那你就小写,不过混写比较麻烦哈),其实valueOf就是调用了枚举的底层映射:

201642785504527.jpg (575×287)

 

 

 

如何避免错误使用 Enum

不过在使用 Enum 时候有几个地方需要注意:

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

转载地址:http://smkoo.baihongyu.com/

你可能感兴趣的文章
3-python中文编码问题个人总结
查看>>
转 - Unix目录结构的来历
查看>>
开发平台部署到sunflysp上
查看>>
我的友情链接
查看>>
小区WLAN无线网卡上面无信号,用测试软件搜不到信号处理办法
查看>>
saltstack管理四之pillar和grains
查看>>
2017年终总结
查看>>
Linux终端下 dstat 监控工具
查看>>
python爬虫
查看>>
[Thinking in JAVA] 前N章的一些小知识
查看>>
字体跨域问题【解决】
查看>>
bugzilla安装笔记
查看>>
My Python笔记
查看>>
C++一些标准模板容器简要介绍(1)
查看>>
Gradle依赖的统一管理
查看>>
我的友情链接
查看>>
Android SDK Managerr开发工具包离线打包 已下载4.1、4.0.3、4.0、2.3.3、1.6直接使用
查看>>
《Android开发从零开始》——32.单选复选控件学习
查看>>
Dell R730配置RAID及系统OS部署步骤
查看>>
Mysql数据库用source命令导入SQL文件
查看>>