美文网首页
JAVA高级(4)—— 枚举

JAVA高级(4)—— 枚举

作者: AndroidMaster | 来源:发表于2018-01-07 16:10 被阅读11次

1、问题

在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量

public class Entity {  
    public static final int VIDEO = 1;//视频  
    public static final int AUDIO = 2;//音频  
    public static final int TEXT = 3;//文字  
    public static final int IMAGE = 4;//图片  
      
    private int id;  
    private int type;  
      
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public int getType() {  
        return type;  
    }  
    public void setType(int type) {  
        this.type = type;  
    }  
}  

缺点:
1)代码可读性差、易用性低;像是setType(2)这种用法也是在所难免,因为它完全合法,不是每个人都能够建立起用常量名代替数值,从而增加程序可读性、降低耦合性的意识。
2)类型不安全;setType(-1)这样的调用是合法的,但它并不合理,今后会为程序带来种种问题。
3)耦合性高,扩展性差;假如,因为某些原因,需要修改Entity类中常量的值,那么,所有用到这些常量的代码也就都需要修改——当然,要仔细地修改,万一漏了一个,那可不是开玩笑的。同时,这样做也不利于扩展。例如,假如针对类别做了一个有效性验证,如果类别增加了或者有所变动,则有效性验证也需要做对应的修改,不利于后期维护。

2、枚举

  • 一种特殊的类,其中的每个元素都是该类的一个实例对象。
  • 可以定义方法,并且实现接口。继承自java.lang.Enum类,因此enum不可以再继承其他的类。
  • 枚举元素必须位于枚举体中最开始部分,以分号结尾。
  • 通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量
  • 用到枚举类型,全部对象都会被实例化,因为都是public static final修饰的
带有构造方法的枚举
public enum TypeEnum {  
    VIDEO(1, "视频"), AUDIO(2, "音频"), TEXT(3, "文本"), IMAGE(4, "图像");  
      
    int value;  
    String name;  
      
    TypeEnum(int value, String name) {  
        this.value = value;  
        this.name = name;  
    }  
      
    public int getValue() {  
        return value;  
    }  
      
    public String getName() {  
        return name;  
    }  
}
带有抽象方法的枚举
    public enum TrafficLamp {
        RED(10) {
            @Override
            public TrafficLamp nextLamp() {
                return GREEN;
            }
        },
        GREEN(20) {
            @Override
            public TrafficLamp nextLamp() {
                return null;
            }
        };
        private int time;

        public abstract TrafficLamp nextLamp();

        TrafficLamp(int time) {
            this.time = time;
        }
    }

3、方法

  • name() String //返回此枚举实例的常量名称。如:RED
  • ordinal() // 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
  • valueOf(String name) T //static方法,根据String转枚举实例
  • values() T[] //static方法,返回该枚举的所有值

4、EnumMap

专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

public enum Phase {
    SOLID, LIQUID, GAS;
    public enum Transition {
        MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(
                GAS, LIQUID), SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
        private final Phase src;
        private final Phase dst;

        Transition(Phase src, Phase dst) {
            this.src = src;
            this.dst = dst;
        }

        private static final Map<Phase, Map<Phase, Transition>> m = new EnumMap<Phase, Map<Phase, Transition>>(
                Phase.class);
        static {
            for (Phase p : Phase.values())
                m.put(p, new EnumMap<Phase, Transition>(Phase.class));
            for (Transition trans : Transition.values())
                m.get(trans.src).put(trans.dst, trans);
        }

        public static Transition from(Phase src, Phase dst) {
            return m.get(src).get(dst);
        }
    }

    public static void main(String[] args) {
        for (Phase src : Phase.values())
            for (Phase dst : Phase.values())
                if (src != dst)
                    System.out.printf("%s to %s : %s %n", src, dst,
                            Transition.from(src, dst));
    }
}

参考文献

浅谈在Java开发中的枚举的作用和用法

相关文章

  • JAVA高级(4)—— 枚举

    1、问题 在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量 缺点:1)代码可读性差、易用性低;像是s...

  • Java高级特性-枚举

    定义 An enum type is a special data type that enables for a...

  • Java高级特性-难点汇总

    Java 数据结构(Java 2之前)(高级) Java工具包提供了强大的数据结构,主要是以下几种: 枚举(Enu...

  • swift 枚举便利的高阶用法

    枚举遍历的高级用法 枚举遍历方法2

  • Java基础-高级特性-枚举介绍

    Java工程师知识树[https://www.jianshu.com/p/db77d19a25f6] / Ja...

  • Java高级-枚举类与注解

    10.1.枚举类的使用: 入门 类的对象只有有限个,确定的 自定义枚举类 一.枚举类的使用1.枚举类的理解: 类的...

  • 枚举

    枚举 wiki Java的枚举类型用法介绍 深入理解Java枚举类型(enum) 为什么要用enum? 学习计划 ...

  • Java枚举

    Java中的每个枚举都是java.lang.Enum的final子类,枚举类中的每个枚举常量都是该枚举类的一个实例...

  • Kotlin基础---枚举类

    Java的枚举 Kotlin的枚举 枚举是极少数Kotlin声明比Java使用了更多的关键字的例子Kotlin用了...

  • 枚举学习

    java enum枚举类 enum(枚举)类介绍 **java枚举类是一组预定义常量的集合,使用enum关键字声明...

网友评论

      本文标题:JAVA高级(4)—— 枚举

      本文链接:https://www.haomeiwen.com/subject/jmvtnxtx.html