Java枚举大全

x33g5p2x  于2021-09-30 转载在 Java  
字(6.2k)|赞(0)|评价(0)|浏览(320)

Java枚举大全

Enum枚举类解析

只要是枚举类都会隐式继承 Enum类 枚举都是常量 不可变类型

这是Enum 类的构造

protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
}

也就是说枚举 可以这样定义

test:

public enum Meiju {
    da1("a",1),da2("a1",2),da3("a2",3);
    private  String name;  //固定写法
    private int index;   //固定写法
    //必须的 固定写法 对应上面 的 name 和 idnex
    Meiju(String name, int index) {
        this.name = name;
        this.index = index;
    }
    public static void main(String[] args) {
        System.out.println("获取name:"+Meiju.da2.name);
        System.out.println("获取index:"+Meiju.da2.index);
        //结果: 
        // 获取name:a1
		// 获取index:2
    }
}

这是Enum 枚举类中 获取 枚举名称的方法

public final String name() {
        return name;
    }

这是Enum 枚举类中 获取 枚举下标的方法

public final int ordinal() {
        return ordinal;
   }

注意不要和上面的name 和index 弄混了 这个是带()的 而且获取的name是他本身

test:

public enum Meiju_1 {
    d1,d2,d3,d4;
    public static void main(String[] args) {
        //获取当前枚举名称
        System.out.println(Meiju.da2.name());
        //获取当前枚举下标 从0开始 
        System.out.println(Meiju.da2.ordinal());
    }
}
结果:
        da2
        1

这里注意的是ordinal获取的是枚举的位置 而上面的index获取的是自定义的index的值 注意区分

这是Enum 枚举类返回枚举名称 和name()一样但是又有区别

name() 需要手动调用 而toString 自动调用

public String toString() {
        return name;
    }

test

public enum Meiju_1 {
    d1,d2,d3,d4;
    public static void main(String[] args) {
        //默认调用toString()
        System.out.println(Meiju.da2);
        System.out.println(Meiju.da2.name());
        //显示调用 toString
        System.out.println(Meiju.da2.toString());
    }
}

结果:
        da2
        da2
        da2

这是这是Enum 枚举类中的 比较方法 和==没区别 这个就没必要说了.

public final boolean equals(Object other) {
        return this==other;
    }

这是这是Enum 枚举类中的比较位置方法

public final int compareTo(E o) {
      //......................
    }

test:

注意 比较的枚举 必须都是一个枚举类 里的

public enum Meiju_1 {
    d1,d2,d3,d4;
    public static void main(String[] args) {
        //比较左边枚举 和右边枚举相差多少位置 从0开始计算 左边小时负数 左边大是正数 如果相等为0
        System.out.println(Meiju_1.d4.compareTo(Meiju_1.d2));
    }
}

这是这是Enum 枚举类中的获取枚举Class对象的方法

public final Class<E> getDeclaringClass() {
      ................
    }

和xx.getClass()  效果差不多

test:

public enum Meiju_1 {
    d1,d2,d3,d4;
    public static void main(String[] args) {
        System.out.println(Meiju_1.d4.getDeclaringClass());
    }
}
结果为 :class Meiju_1

将字符串转换为枚举类型

注意这个字符串必须 是 枚举中有的 否则报错

public enum Meiju_1 {
    d1,d2,d3,d4;
    public static void main(String[] args) {
        Meiju_1 meiju=Meiju_1.valueOf("d1");
        System.out.println(meiju.ordinal());
    }
}

java枚举常见用法

用法一:常量

在JDK1.5 之前,我们定义常量都是: public static fianl… 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

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

用法二:switch

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

定义一个枚举类

public enum Signal {
    hong, huang, lan;
}

测试

public class test {
    public static void main(String[] args) {
        Signal men=Signal.hong;
        switch (men){
            case hong:
                System.out.println("我是红");
                break;
            case lan:
                System.out.println("我是蓝");
                break;
            case huang:
                System.out.println("我是黄");
                break;
        }
    }

}
结果: 我是红

用法三:向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例

public enum Color {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    // 成员变量
    private String name;  //对应上面的name
    private int index;   //对应上面的index
    // 构造方法 必须
    Color(String name, int index) {
        this.name = name;
        this.index = index;
    }
    // 普通方法
    public static String getBj(int index) {
        for (Color c : Color.values()) {
            //获取枚举的 index 和传进来的 index进行比较
            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;
    }
}

测试

public class test {
    public static void main(String[] args) {
        System.out.println(Color.getBj(1));
    }
    
    结果: 红色

}

用法四:重写枚举的方法

比如toString方法在Enum枚举类中

public String toString() {  //输出name
    return name;
}

我们在子类将父类的toString重写

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() {输出name 和index
          return this.name+"_"+this.index;
    }
}
public class test {
    public static void main(String[] args) {
        System.out.println(Color.BLANK);
    }
}
结果:白色_3

用法五:实现接口

所有的枚举都继承自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);
    }
}

test

public class test {
    public static void main(String[] args) {
        System.out.println(Color.BLANK.getInfo());
        Color.BLANK.print();
    }
结果:
    白色
	3:白色	
}

用法六:使用接口组织枚举

public interface Food {
    enum Coffee implements Food{
        BLACK_COFFEE("hu",123),DECAF_COFFEE("hu1",123),LATTE("hu2",123),CAPPUCCINO("hu3",123);
        private  String name;
        private  int index;
        Coffee(String name, int index) {
            this.name=name;
            this.index=index;
        }

        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 Dessert implements Food{
        FRUIT, CAKE, GELATO
    }
}

test

public class test {
    public static void main(String[] args) {
        System.out.println(Food.Coffee.BLACK_COFFEE.getName());
        System.out.println(Food.Dessert.CAKE.name());
    }

}
结果:
	hu
    CAKE

用法七:关于枚举集合的使用

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型

public enum TestEnum1 {
    MONDAY("星期一"),
    SENTENDAY("星期二");
    private String name;
    private TestEnum1(String name) {
        this.name = name;
    }

}

java.util.EnumMap

​ 使用方法和map一样 只是key必须是枚举

public class test {
    public static void main(String[] args) {
        //枚举集合 EnumMap简单实用
        EnumMap< TestEnum1, String> map = new  EnumMap< TestEnum1, String> ( TestEnum1.class);
        map.put(TestEnum1.MONDAY,"1");
        map.put(TestEnum1.SENTENDAY,"2");
        System.out.println(map);

    }

}
结果:
{MONDAY=1, SENTENDAY=2}

java.util.EnumSet

使用方法和和Set差不多

public static void main(String[] args) {
    //将枚举的全部类型设置到EnumSet对象之中
        EnumSet<TestEnum1> es1 = EnumSet.allOf(TestEnum1.class);
        System.out.println(es1);
        //[MONDAY, SENTENDAY]
    }
public static void main(String[] args) {
     //创建只能放入TestEnum1类型的 EnumSet集合
        EnumSet<TestEnum1> es3 = EnumSet.noneOf(TestEnum1.class);
		//添加值
            es3.add(TestEnum1.SENTENDAY);
            es3.add(TestEnum1.MONDAY);
          System.out.println(es3);
          //[MONDAY, SENTENDAY]
    }
public static void main(String[] args) {
        //将集合 es3 内容拷贝到 es4中
        EnumSet<TestEnum1> es3 = EnumSet.allOf(TestEnum1.class);
        EnumSet<TestEnum1> es4 = EnumSet.copyOf(es3);
        System.out.println(es4);
        //[MONDAY, SENTENDAY]
    }

相关文章