java enum类

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 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值