Java enum的用法详解ITeye - 千亿集团

Java enum的用法详解ITeye

2019年03月14日15时36分31秒 | 作者: 鑫鹏 | 标签: 办法,用法,枚举 | 浏览: 1006

用法一:常量

在JDK1.5 之前,咱们界说常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,并且枚举供给了比常量更多的办法。

public enum Color { 
 RED, GREEN, BLANK, YELLOW 
} 

 

用法二:switch

JDK1.6之前的switch句子只支撑int,char,enum类型,运用枚举,能让咱们的代码可读性更强。

enum Signal {
 GREEN, YELLOW, RED
 public class TrafficLight {
 Signal color = Signal.RED;
 public void change() {
 switch (color) {
 case RED:
 color = Signal.GREEN;
 break;
 case YELLOW:
 color = Signal.RED;
 break;
 case GREEN:
 color = Signal.YELLOW;
 break;
 }

用法三:向枚举中增加新办法

假如计划自界说自己的办法,那么有必要在enum实例序列的最终增加一个分号。并且 Java 要求有必要先界说 enum 实例。

public enum Color {
 RED("赤色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
 // 成员变量
 private String name;
 private int index;
 // 结构办法
 private Color(String name, int index) {
 this.name = name;
 this.index = index;
 // 一般办法
 public static String getName(int index) {
 for (Color c : Color.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;
 }

用法四:掩盖枚举的办法

下面给出一个toString()办法掩盖的比方。

public class Test {
 public enum Color {
 RED("赤色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
 // 成员变量
 private String name;
 private int index;
 // 结构办法
 private Color(String name, int index) {
 this.name = name;
 this.index = index;
 // 掩盖办法
 @Override
 public String toString() {
 return this.index + "_" + this.name;
 public static void main(String[] args) {
 System.out.println(Color.RED.toString());
}

用法五:完成接口

一切的枚举都承继自java.lang.Enum类。因为Java 不支撑多承继,所以枚举目标不能再承继其他类。

public interface Behaviour {
 void print();
 String getInfo();
 public enum Color implements Behaviour {
 RED("赤色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
 // 成员变量
 private String name;
 private int index;
 // 结构办法
 private Color(String name, int index) {
 this.name = name;
 this.index = index;
 // 接口办法
 @Override
 public String getInfo() {
 return this.name;
 // 接口办法
 @Override
 public void print() {
 System.out.println(this.index + ":" + this.name);
 }

用法六:运用接口安排枚举

public interface Food {
 enum Coffee implements Food {
 BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
 enum Dessert implements Food {
 FRUIT, CAKE, GELATO
 }

用法七:关于枚举调集的运用

java.util.EnumSet和java.util.EnumMap是两个枚举调集。EnumSet保证调集中的元素不重复;EnumMap中的 key是enum类型,而value则可以是恣意类型。关于这个两个调集的运用就不在这里赘述,可以参阅JDK文档

 

枚举和常量界说的差异

一、 一般界说常量办法

咱们一般运用public final static办法界说的代码如下,分别用1表明红灯,3表明绿灯,2表明黄灯。

public class Light {
 /* 红灯 */
 public final static int RED = 1;
 /* 绿灯 */
 public final static int GREEN = 3;
 /* 黄灯 */
 public final static int YELLOW = 2;
 }

二、 枚举类型界说常量办法

枚举类型的简略界说办法如下,咱们好像没办法界说每个枚举类型的值。比方咱们界说红灯、绿灯和黄灯的代码或许如下:

public enum Light {
 RED, GREEN, YELLOW;
 }

咱们只可以表明出红灯、绿灯和黄灯,可是详细的值咱们没办法表明出来。别急,已然枚举类型供给了结构函数,咱们可以经过结构函数和覆写toString办法来完成。首要给Light枚举类型增加结构办法,然后每个枚举类型的值经过结构函数传入对应的参数,一起覆写toString办法,在该办法中回来从结构函数中传入的参数,改造后的代码如下:

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);
}

三、 完好示例代码

枚举类型的完好演示代码如下:

public class LightTest {
 // 1.界说枚举类型
 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);
 * @param args
 public static void main(String[] args) {
 // 1.遍历枚举类型
 System.out.println("演示枚举类型的遍历 ......");
 testTraversalEnum();
 // 2.演示EnumMap目标的运用
 System.out.println("演示EnmuMap目标的运用和遍历.....");
 testEnumMap();
 // 3.演示EnmuSet的运用
 System.out.println("演示EnmuSet目标的运用和遍历.....");
 testEnumSet();
 * 演示枚举类型的遍历
 private static void testTraversalEnum() {
 Light[] allLight = Light.values();
 for (Light aLight : allLight) {
 System.out.println("当时灯name:" + aLight.name());
 System.out.println("当时灯ordinal:" + aLight.ordinal());
 System.out.println("当时灯:" + aLight);
 * 演示EnumMap的运用,EnumMap跟HashMap的运用差不多,只不过key要是枚举类型
 private static void testEnumMap() {
 // 1.演示界说EnumMap目标,EnumMap目标的结构函数需求参数传入,默许是key的类的类型
 EnumMap Light, String currEnumMap = new EnumMap Light, String (
 Light.class);
 currEnumMap.put(Light.RED, "红灯");
 currEnumMap.put(Light.GREEN, "绿灯");
 currEnumMap.put(Light.YELLOW, "黄灯");
 // 2.遍历目标
 for (Light aLight : Light.values()) {
 System.out.println("[key=" + aLight.name() + ",value="
 + currEnumMap.get(aLight) + "]");
 * 演示EnumSet怎么运用,EnumSet是一个抽象类,获取一个类型的枚举类型内容 BR/ 
 * 可以运用allOf办法
 private static void testEnumSet() {
 EnumSet Light currEnumSet = EnumSet.allOf(Light.class);
 for (Light aLightSetElement : currEnumSet) {
 System.out.println("当时EnumSet中数据为:" + aLightSetElement);
}

履行成果如下:

演示枚举类型的遍历 ......

当时灯name:RED

当时灯ordinal:0

当时灯:1

当时灯name:GREEN

当时灯ordinal:1

当时灯:3

当时灯name:YELLOW

当时灯ordinal:2

当时灯:2

演示EnmuMap目标的运用和遍历.....

[key=RED,value=红灯]

[key=GREEN,value=绿灯]

[key=YELLOW,value=黄灯]

演示EnmuSet目标的运用和遍历.....

当时EnumSet中数据为:1

当时EnumSet中数据为:3

当时EnumSet中数据为:2

四、 一般界说常量办法和枚举界说常量办法差异

以下内容或许有些无聊,但肯定值得一窥

1. 代码:

public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}

有什么不好了,咱们都这样用了很长时刻了,没什么问题啊。

首要,它不是类型安全的。你有必要保证是int

其次,你还要保证它的规模是0和1

最终,许多时分你打印出来的时分,你只看到 1 和0 ,

但其没有看到代码的人并不知道你的妄图,扔掉你一切旧的public static final常量 

2. 可以创立一个enum类,把它看做一个一般的类。除了它不能承继其他类了。(java是单承继,它现已承继了Enum),

可以增加其他办法,掩盖它本身的办法

3. switch()参数可以运用enum了

4. values()办法是编译器刺进到enum界说中的static办法,所以,当你将enum实例向上转型为父类Enum是,values()就不行访问了。处理办法:在Class中有一个getEnumConstants()办法,所以即使Enum接口中没有values()办法,咱们依然可以经过Class目标获得一切的enum实例

5. 无法从enum承继子类,假如需求扩展enum中的元素,在一个接口的内部,创立完成该接口的枚举,以此将元素进行分组。到达将枚举元素进行分组。

6. 运用EnumSet替代标志。enum要求其成员都是仅有的,可是enum中不能删去增加元素。

7. EnumMap的key是enum,value是任何其他Object目标。

8. enum答应程序员为eunm实例编写办法。所以可以为每个enum实例赋予各自不同的行为。

9. 运用enum的责任链(Chain of Responsibility) .这个关系到规划形式的责任链形式。以多种不同的办法来处理一个问题。然后将他们链接在一起。当一个恳求到来时,遍历这个链,直到链中的某个处理方案可以处理该恳求。

10. 运用enum的状态机

11. 运用enum多路分发

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章