java基础--15(枚举)

目录

 

1.认识枚举

2.常用的API

 3.枚举的常用方式


1.认识枚举

    枚举是java5加入的特性了,说起来也不算是新的东西了,枚举有很多深入的用法,这里只说一些简单的用法。因为太复杂的我也不懂,下面定义一个简单的枚举,这就是一个最简单的枚举。

public enum  Type {
    OPEN, CLOSE
}

 所有的枚举都是Enum的子类,首先枚举是一个特殊的class,编译器会生成一个相关的类,这个类继承自java.lang.Enum,这个class相当于final static修饰,不能被继承,他的构造方法强制被私有化,由于Java 不支持多继承,所以枚举对象不能再继承其他类。

2.常用的API

  一般来说我们希望每个枚举实例都可以返回自己的描述

package com.wx1.test4;

/**
 * User: Mr.Wang
 * Date: 2019/10/29
 */
public enum NoticeSendTypeE {
    EMAIL("email"),
    SITE_MESSAGE("siteMessage"),
    EMAIL_AND_SITE_MESSAGE("emailAndSiteMessage");

    private String typeName;
    private static final String STRING = "lalal";

    NoticeSendTypeE(String typeName) {
        this.typeName = typeName;
    }

    /**
     * 根据类型的名称,返回类型的枚举实例。
     *
     * @param typeName 类型名称
     */
    public static NoticeSendTypeE fromTypeName(String typeName) {
        for (NoticeSendTypeE type : NoticeSendTypeE.values()) {
            if (type.getTypeName().equals(typeName)) {
                return type;
            }
        }
        return null;
    }

    public String getTypeName() {
        return this.typeName;
    }

}

NoticeSendTypeE email = NoticeSendTypeE.EMAIL;
System.out.println(NoticeSendTypeE.EMAIL.toString()); //EMAIL
NoticeSendTypeE email2 = Enum.valueOf(NoticeSendTypeE.class, "EMAIL");
NoticeSendTypeE[] values = NoticeSendTypeE.values();
email1.getTypeName() //email
通过Class来拿 和values 方法差不多,values是编译器插入的静态方法
NoticeSendTypeE[] enumConstants = NoticeSendTypeE.class.getEnumConstants();

 3.枚举的常用方式

  •    静态导入

      这样可以不用显示的修饰枚举实例

package com.wx1.test3;
import com.wx1.test4.NoticeSendTypeE;
import static com.wx1.test4.NoticeSendTypeE.*;
/**
 * 枚举的静态导入
 */
public class Test3 {
    private NoticeSendTypeE noticeSendTypeE;

    public Test3(NoticeSendTypeE noticeSendTypeE) {
        this.noticeSendTypeE = noticeSendTypeE;
    }

    public static void main(String[] args) {
        Test3 test3 = new Test3(EMAIL);
    }
}
  •   switch是要在有限的可能值集合中进行选择,因此他与eunm正是绝佳组合。

一般switch都是整型的数值,枚举天生就具备整型数值的次序,需要注意的是在case语句中使用break,如果不写default,那么必须确保覆盖所有的实例,,如果case语句中写return就需要写default.

        String s1 = "email";
        NoticeSendTypeE email3 = NoticeSendTypeE.EMAIL;
        switch (NoticeSendTypeE.fromTypeName(s1)) {
            case EMAIL:
                email3 = NoticeSendTypeE.SITE_MESSAGE;
                break;
            case SITE_MESSAGE:
                email3 = NoticeSendTypeE.EMAIL_AND_SITE_MESSAGE;
                break;
            case EMAIL_AND_SITE_MESSAGE:
                email3 = NoticeSendTypeE.EMAIL;
                break;
        }
  •   枚举实现接口

    枚举实现接口可以给枚举的实例分组

package com.wx1.test4;

import com.wx.test19.Generator;

import java.util.Random;

/**
 * User: Mr.Wang
 * Date: 2019/10/31
 */
public enum Type implements Generator<Type> {
    OPEN("open"),
    CLOSE("close");
    private String typeName;
    private Random random = new Random(47);

    Type(String typeName) {
        this.typeName = typeName;
    }

    public static Type fromTypeName(String typeName) {
        for (Type type : Type.values()) {
            if (type.getTypeName().equals(typeName)) {
                return type;
            }
        }
        return null;
    }

    public String getTypeName() {
        return this.typeName;
    }

    @Override
    public Type next() {
        return this.values()[random.nextInt(values().length)];
    }
}

每个枚举变量都是枚举类ColorEnum的实例,相当于RED=new ColorEnum(1),按序号来。每个成员变量都是final static修饰。定义一个枚举:

public enum Shrubbery {
    GROUND,
    CRAWLING,
    HANGING
}

 历遍枚举,取枚举的值:

 public static void main(String[] args) {
        Shrubbery[] values = Shrubbery.values();
        for (Shrubbery value : values) {
            System.out.print(value+"::"+value.ordinal()+"::");
            System.out.print(value.compareTo(Shrubbery.CRAWLING)+"::");
            System.out.print(value.equals(Shrubbery.CRAWLING)+"::");
            System.out.print(value.getDeclaringClass()+"::");
            System.out.println(value.name());
        }

    }

  

 ordinal返回枚举变量的序号,这个values返回的是一个实例化枚举的对象的数组。name返回的是实例化对象的名字,在枚举的实例上调用getDeclaringClass(),就可知道其所属的枚举类。

  •   覆盖枚举的方法
       覆盖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() {
        return this.index + "_" + this.name;
    }
}
  •   EnumSet EnumMap 使用他们的好处就是速度快
 EnumSet<NoticeSendTypeE> noticeSendTypeES 
                = EnumSet.of(NoticeSendTypeE.EMAIL, NoticeSendTypeE.SITE_MESSAGE);
        for (NoticeSendTypeE noticeSendTypeE : noticeSendTypeES) {
            System.out.println(noticeSendTypeE.getTypeName());
        }
  •  还可以为枚举实例编写方法

  这可以使每个枚举实例具备自己独特的行为

  • 使用枚举创建单例模式

  创建安全的单例最好的方法

  

 参考博客:

  https://blog.csdn.net/newbie_907486852/article/details/81027512

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/98772003