在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外。然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看。 1、可以在enum中添加变量和方法 先来看一段代码示例: java代码 01 public enum State { 02 Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); 03 // 成员变量 04 private String name; 05 private int index; 06 07 // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化 08 private State(String name, int index) { 09 this.name = name; 10 this.index = index; 11 } 12 13 // 普通方法 14 public static String getName(int index) { 15 for (State c : State .values()) { 16 if (c.getIndex() == index) { 17 return c.name; 18 } 19 } 20 return null; 21 } 22 23 // get set 方法 24 public String getName() { 25 return name; 26 } 27 28 public void setName(String name) { 29 this.name = name; 30 } 31 32 public int getIndex() { 33 return index; 34 } 35 36 public void setIndex(int index) { 37 this.index = index; 38 } 39 } 从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。 2、可以用来定义常量 先来回顾一下Java中如何定义常量吧,看下面一段代码: java代码 1 public static final int normalState = 1; 2 private static final int updateState = 2; 下面我们还可以用enum枚举来代替上面的常量定义,代码如下: java代码 1 public enum State { 2 Normal, Update, Deleted, Fired 3 } 在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。 3、在enum中实现接口 先来看下面一段代码: java代码 01 public interface ICanReadState { 02 void read(); 03 04 String getState(); 05 } 06 07 public enum State implements ICanReadState { 08 Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); 09 10 private String name; 11 private int index; 12 13 private State(String name, int index) { 14 this.name = name; 15 this.index = index; 16 } 17 18 // 接口方法1 19 20 @Override 21 public String getState() { 22 return this.name; 23 } 24 25 // 接口方法2 26 @Override 27 public void read() { 28 System.out.println(this.index + ":" + this.name); 29 } 30 } 和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。 总结 说白了,enum枚举类型是一个不可以被继承的final类,就以上面的State枚举为例,如果你查看enum类型的字节码,其实是State类型的类静态常量。 |
我们在定义常量的时候,可以把常量定义在接口里面,如:
上面是我定义的接口和常量。 常量的定义没有指明public static。 我实现此接口:
那么我们如何访问呢? 我做了一个demo:
执行的结果如下:
在上面的程序中,我们使用了两种不同的方法来取得了name的值。 由第一种方法我们可以知道:其实接口内定义的所有的属性和方法都是public类型的。如果是属性,其默认是Public static的。 通过第二种方法我们可以知道,此属性是公有的。否则我们怎么能直接访问呢? 由上面的结论,我们可以知道,为什么我们定义接口中的方法的时候,不用添加public,可以定义如下方法:
当然你也可以这样定义:
|
1. 抽象类 |
|( 京ICP备09078825号 )
GMT+8, 2024-11-23 18:56 , Processed in 0.122785 second(s), 44 queries .