首页 > 编程语言 >10 | JAVA枚举类enum

10 | JAVA枚举类enum

时间:2022-09-02 08:22:31浏览次数:67  
标签:10 JAVA enum day 枚举 Weekday dayValue public

枚举类 enum

public class Main {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        if (day == Weekday.SAT || day == Weekday.SUN) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }
}

enum Weekday {
    SUN, MON, TUE, WED, THU, FRI, SAT;
}

注意到定义枚举类是通过关键字enum实现的,我们只需依次列出枚举的常量名。

int定义的常量相比,使用enum定义枚举有如下好处:

首先,enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误。例如,下面的语句不可能编译通过:.

int day = 1;
if (day == Weekday.SUN) { // Compile error: bad operand types for binary operator '=='
}

enum 的比较

使用enum定义的枚举类是一种引用类型。前面我们讲到,引用类型比较,要使用equals()方法,如果使用==比较,它比较的是两个引用类型的变量是否是同一个对象。因此,引用类型比较,要始终使用equals()方法,但enum类型可以例外。

这是因为enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用==比较:

if (day == Weekday.FRI) { // ok!
}
if (day.equals(Weekday.SUN)) { // ok, but more code!
}

通过enum定义的枚举类,和其他的class有什么区别?

答案是没有任何区别。enum定义的类型就是class,只不过它有以下几个特点:

  • 定义的enum类型总是继承自java.lang.Enum,且无法被继承;
  • 只能定义出enum的实例,而无法通过new操作符创建enum的实例;
  • 定义的每个实例都是引用类型的唯一实例;
  • 可以将enum类型用于switch语句。

例如,我们定义的Color枚举类:

public enum Color {
    RED, GREEN, BLUE;
}

编译器编译出的class大概就像这样:

public final class Color extends Enum { // 继承自Enum,标记为final class
    // 每个实例均为全局唯一:
    public static final Color RED = new Color();
    public static final Color GREEN = new Color();
    public static final Color BLUE = new Color();
    // private构造方法,确保外部无法调用new操作符:
    private Color() {}
}

枚举类的方法

因为enum是一个class每个枚举的值都是class实例,因此,这些实例有一些方法:

  • name()
String s = Weekday.SUN.name(); // "SUN"
  • ordinal()

返回定义的常量的顺序,从0开始计数,例如:

int n = Weekday.MON.ordinal(); // 1

关于 可扩展性和健壮性

public class Main {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        if (day.dayValue == 6 || day.dayValue == 0) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }
}
enum Weekday {
    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0);

    public final int dayValue;

    private Weekday(int dayValue) {
        this.dayValue = dayValue;
    }
}
//这样就无需担心顺序的变化,新增枚举常量时,也需要指定一个int值。

不推荐的代码

String task = Weekday.MON.ordinal() + "/ppt";
saveToFile(task);

覆写toString

默认情况下,对枚举常量调用toString()会返回和name()一样的字符串。但是,toString()可以被覆写,而name()则不行。我们可以给Weekday添加toString()方法:

public class Main {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        if (day.dayValue == 6 || day.dayValue == 0) {
            System.out.println("Today is " + day + ". Work at home!");
        } else {
            System.out.println("Today is " + day + ". Work at office!");
        }
    }
}

enum Weekday {
    MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");

    public final int dayValue;
    private final String chinese;

    private Weekday(int dayValue, String chinese) {
        this.dayValue = dayValue;
        this.chinese = chinese;
    }

    @Override
    public String toString() {
        return this.chinese;
    }
}

注意:判断枚举常量的名字,要始终使用name()方法,绝不能调用toString()!

标签:10,JAVA,enum,day,枚举,Weekday,dayValue,public
From: https://www.cnblogs.com/mmxingye/p/16648482.html

相关文章

  • 11 | JAVA纪录类Record
    纪录类(也是一种不变类)使用String、Integer等类型的时候,这些类型都是不变类,一个不变类具有以下特点:定义class时使用final,无法派生子类;每个字段使用final,保证创建实例......
  • Java-JDBC和mysql的使用
    1.MySqlJDBC(JavaDataBaseConnection)是通过JAVA访问数据库,需要对数据库有基本的理解和应用。MySql作为常见的数据库,在中小型网站经常被使用;其中包含了mysql服务器......
  • Java Web技术栈
    SpringBootMaven<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc......
  • 2022 HDU多校10
    WinnerPrediction(网络流)Problem\(n\)个人进行比赛,赢最多的人获胜,保证一定可以分出胜负,现在已知\(m_1\)场对决结果,还有\(m_2\)场对决结果未知,但知道比赛的两个人是谁,问......
  • CSS 面试问题的答案——第一部分 (1-10/34)
    CSS面试问题的答案——第一部分(1-10/34)该材料有助于为前端职位的面试做准备。我回答了GitHub存储库中最受欢迎的问题列表中的所有CSS问题——前端-开发者-面试-......
  • 2022 年 8 月 JavaScript 新闻和更新
    2022年8月JavaScript新闻和更新向所有JavaScript崇拜者致敬!很遗憾夏天结束了,但我们准备了一份最新的JavaScript新闻摘要来让你振作起来。今天,您将熟悉我们全新......
  • java.beans.BeanInfo
    可用通过BeanInfo接口创建BeanInfo类,并提供关于bean的方法、属性、事件和其他特性的显式信息。通用方式BeanInfobeanInfo=Introspector.getBeanInfo(TradeTransaction......
  • [Java]零基础入门学习Day(1)
    Java环境的搭建Java开发工具Eclipse的下载与安装Java的第一个程序("HelloWorld") 一.Java环境的搭建1.下载JDK 首先我们需要下载java的开发工具包JDK,下载地址:......
  • NC24734 [USACO 2010 Mar G]Great Cow Gathering
    题目链接题目题目描述BessieisplanningtheannualGreatCowGatheringforcowsallacrossthecountryand,ofcourse,shewouldliketochoosethemostconv......
  • Day 5 java
    Scanner的用法首先引用import库importjava.util.Scanner;下面输入时Scannerscanner=newScanner(System.in);Stringname=scanner.next();charAt(i)name.char......