ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java16:枚举类型

2022-01-21 15:30:33  阅读:233  来源: 互联网

标签:Java16 Color SUN enum 枚举 Weekday 类型 public


使用enum来定义枚举类:

enum Weekday {
    SUN, MON, TUE, WED, THU, FRI, SAT; //依次列出枚举的常量名
}

class test {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;  //为枚举类型
        if (day == Weekday.SUN) { }
    }
}

使用enum定义的枚举类是一种引用类型。通常情况下,引用类型进行比较要使用equals()方法,如果使用==比较,它比较的是两个引用类型的变量是否是同一个对象。
但enum类型可以例外,因为enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用==比较

enum定义的类型本质上就是class,它的独特之处是:

  • 定义的enum类型总是继承自java.lang.Enum,且无法被继承
  • 只能定义出enum的实例,而无法通过new操作符创建enum的实例
  • 定义的每个实例都是引用类型的唯一实例
  • 可以将enum类型用于switch语句
    枚举类天生具有类型信息和有限个枚举常量,非常适合用于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 Color() {} // private构造方法,确保外部无法调用new操作符
    ...
}

枚举类的创建本质:

enum {
	//SUN, MON, TUE, WED, THU, FRI, SAT;
	//SUN(3), MON(1), TUE(4), WED(0), THU(2), FRI(5), SAT(6);
	//MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");
	//本质上是调用构造函数创建了一个实例对象
}
简写实际核心代码
SUNWeekday SUN = new Weekday()
SUN(3)Weekday SUN = new Weekday(3)
SUN(3, "星期日")Weekday SUN = new Weekday(3, "星期日")

因此也可以自己给enum编写构造方法、变量和方法。
(enum的构造方法要声明为private,变量强烈建议声明为final)


enum类中还有一些实例函数:

  • name():将枚举量转换为字符串,返回字符串
String s = Weekday.SUN.name(); // "SUN"
  • ordinal():返回定义的常量的顺序(即转为int型),默认从0开始计数
int n = Weekday.MON.ordinal(); // 1

如果想要指定每个枚举常量对应的int型数字,可以自定义构造函数为:

enum Weekday {
    SUN(3), MON(1), TUE(4), WED(0), THU(2), FRI(5), SAT(6);

    public final int value;

    private Weekday(int value) {
        this.value = value;
    }
}

class test {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        System.out.println(day.value);
    }
}

如此即使枚举常量的顺序改变,其对应的int值仍不会变,提高了代码的健壮性。

  • toString():默认情况下,对枚举常量调用toString()会和name()一样返回相同的字符串。但是,toString()可以被重写,而name()则不行
class test {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        System.out.println(day.name());  //SUN
        System.out.println(day.toString()); //星期日
        System.out.println("Today is " + day); //Today is 星期日
        //引用类型转化为字符串时,会自动调用toString()方法
    }
}

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() {  //重写toString函数
        return this.chinese;
    }
}

重写toString()的目的是在输出时更有可读性。
注意:判断枚举常量的名字时,要始终使用name()方法,绝不能调用toString()!

标签:Java16,Color,SUN,enum,枚举,Weekday,类型,public
来源: https://blog.csdn.net/Shao_yihao/article/details/122621099

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有