zoukankan      html  css  js  c++  java
  • java 枚举 enum 总结

        枚举之前定义常量就需要 public static fianl...,列如:

    public static final int MONDAY =1;

    public static final int TUESDAY=2;
    public static final int WEDNESDAY=3;

    public static final int THURSDAY=4;

    public static final int FRIDAY=5;

    public static final int SATURDAY=6;

    public static final int SUNDAY=7;

    上述的常量定义常量的方式称为int枚举模式,这样的定义方式并没有什么错,
    但它存在许多不足,如在类型安全和使用方便性上并没有多少好处,如果存在定义int值相同的变量,
    混淆的几率还是很大的,编译器也不会提出任何警告,
    因此这种方式在枚举出现后并不提倡,现在我们利用枚举类型来重新定义上述的常量,同时也感受一把枚举定义的方式

    //枚举类型,使用关键字enum enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

    String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
    int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)

    用法二:switch

    JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强:

    enum Signal {
    GREEN, YELLOW, RED
    }

    public class Stutent {
    public void change(Signal color) {
    switch (color) {
    case RED:
    color = Signal.GREEN;
    System.out.println("sdsd");
    break;
    case YELLOW:
    color = Signal.RED;
    break;
    case GREEN:
    color = Signal.YELLOW;
    break;
    }
    }
    }

    用法三:向枚举中添加新属性

    public enum Error {
    BOLE_ERROR("无敌于天下", 1), BOLE_ERROR2("独孤求败", 2), BOLE_ERROR3("独孤求败3", 3);
    private String name;
    private Integer index;

    private Error(String name, Integer index) {
    this.name = name;
    this.index = index;
    }

    public String getName() {
    return name;
    }

    public Integer getIndex() {
    return index;
    }

    }

    只用get方法就行了,通过构造器赋值。

    用法四:向枚举中添加相关的常量的方法

    java 的enum有一个非常有趣的特性,即它允许程序员为enum实列编写方法,从而为每个enum实列赋予各自不同的行为。要实现相关的方法,你需要

    为enum定义一个或者多个abstract方法,然后为每个实列实现该抽象方法:

    public enum ConstantSpecificMethod {
    DATE_TIME {
    String getInfo() {
    return DateFormat.getDateInstance().format(new Date());
    }
    },
    CLASSPATH {
    String getInfo() {
    return System.getenv("CLASSPATH");
    }
    },
    VERSION {
    String getInfo() {
    return System.getProperty("java.version");
    }
    };
    abstract String getInfo();

    public static void main(String[] args) {
    System.out.println(ConstantSpecificMethod.DATE_TIME.getInfo());

    }
    }

    用法五:实现接口

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

    枚举集合EnumSet.向EnumSet添加enum实列的顺序并不重要,因为其输出的次序决定于enum实列定义时的次序,只能放枚举定义的类型,

    enum FOOD {
    APPLE, TTTT, AAAA, CCCC, DDDD
    }

    public class TestSet {
    public static void main(String[] args) {
    EnumSet<FOOD> set=EnumSet.noneOf(FOOD.class);
    set.add(FOOD.APPLE);
    set.add(FOOD.TTTT);
    for (FOOD enum1 : set) {
    System.out.println(enum1.name());
    }

    }

    }

    EnumMap的使用:

    EnumMap是一种特殊的Map,它要求其中的键(key)必须来自一个enum.由于enum本身的限制,所以EnumMap在内部可由数组实现。因此EnumMap的速度很快,我们可以放心

    地使用enum实列在EnumMap中进行查找操作。不过,我们只能将enum的实列作为键来调用put()方法,其他操作与使用一般的Map差不多。与EnumSet一样,enum实列定义

    的次序决定了在其EnumMap中的顺序。

    public class EnumMapps {

    public static void main(String[] args) {
    EnumMap<Color,Command> em=new EnumMap<Color,Command>(Color.class);
    em.put(Color.BACK, new Command() {
    @Override
    public void action() {
    System.out.println("Color.BACK ");
    }
    });
    em.put(Color.GRREN, new Command() {
    @Override
    public void action() {
    System.out.println("Color.GRREN ");
    }
    });

    for(Map.Entry<Color, Command> e:em.entrySet()){
    em.get(Color.BACK).action();
    }


    }

    }

  • 相关阅读:
    C#的委托
    解决.net core3.1使用docker部署在Ubuntu上连接sqlserver报error:35的问题
    【WPF学习】第三十六章 样式基础
    asp.net core 3.x 身份验证-3cookie身份验证原理
    C#设计模式学习笔记:(9)组合模式
    Asp.net Core MVC(三)UseMvc设置路由
    C#后台异步消息队列实现
    ASP.NET CORE 内置的IOC解读及使用
    VS2015发布WEB项目
    C#的冒泡排序
  • 原文地址:https://www.cnblogs.com/caibixiang123/p/8624016.html
Copyright © 2011-2022 走看看