【Java】 Java中枚举类型的的作用与本质

在涉及到使用大量需要标记的内容的时候,我们一般选择使用枚举类型来快速定义内容,但是不仅仅是因为快速,同时使用枚举类型更加的安全.

引入:

举个例子: 现在需要来不使用枚举来表示一周七天用来安排放假时间我们如何在程序中表达:

首先是对一个星期的每一天进行定义

方法A:

class week{
    static int Monday = 1;
    static int Tuesday = 2;
    static int Wednesday = 3;
    static int Thursday = 4;
    static int Friday = 5;
    static int Saturday = 6;
    static int Sunday = 7;
}

方法B:

class week{
    final static int Monday = 1;
    final static int Tuesday = 2;
    final static int Wednesday = 3;
    final static int Thursday = 4;
    final static int Friday = 5;
    final static int Saturday = 6;
    final static int Sunday = 7;
}

方法C:

class week{
    final static week Monday = new week();
    final static week Tuesday = new week();
    final static week Wednesday = new week();
    final static week Thursday = new week();
    final static week Friday = new week();
    final static week Saturday = new week();
    final static week Sunday = new week();
}
  • 方法A:
    直接将每一天作为整型变量存储起来,这会导致两个问题:
    首先作为一个变量自然是可变的,这会导致这个变量被更改
    而且作为一个数字在被调用的时候可以直接使用其他数据,例如

    public static void main(String[] args) {
        Worker worker = new Worker();
        worker.setFreeDay(week.Saturday);
        worker.setFreeDay(1);
        worker.setFreeDay(9);
    }
    

    出现了一下意料之外的数据,比如星期九?

  • 方法B:
    解决了数据会被篡改的问题啊因为使用final修改为了常量
    但是依旧没有解决数字会被随意调用的问题

  • 方法C:
    使用week对象来作为内容,对象是唯一的这保证了不会被随意调用
    实际上使用枚举就是在使用当前方法


枚举类型的本质:

还是使用以上的数据,我们定义一个枚举类型:

enum week{
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}

编译之后我们使用反编译工具进行查看

final class week extends Enum
{

	public static final week Monday;
	public static final week Tuesday;
	public static final week Wednesday;
	public static final week Thursday;
	public static final week Friday;
	public static final week Saturday;
	public static final week Sunday;
	private static final week $VALUES[];

	public static week[] values()
	{
		return (week[])$VALUES.clone();
	}

	public static week valueOf(String name)
	{
		return (week)Enum.valueOf(week, name);
	}

	private week(String s, int i)
	{
		super(s, i);
	}

	static 
	{
		Monday = new week("Monday", 0);
		Tuesday = new week("Tuesday", 1);
		Wednesday = new week("Wednesday", 2);
		Thursday = new week("Thursday", 3);
		Friday = new week("Friday", 4);
		Saturday = new week("Saturday", 5);
		Sunday = new week("Sunday", 6);
		$VALUES = (new week[] {
			Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
		});
	}
}

可以看大反编译的内容实际上enum类型就是一个继承了Enum类的类,也就是说enum枚举类型实际上就是一个类,而在之中我们可以看见其中的成员变量类似于方法C,只不过初始化是集中在后面的

private week(String s, int i)

这是他的构造器,使用私有是因为枚举类型不需要被实例化

public static week[] values()

这个方法的作用是讲当前的枚举类型转化为枚举类型数组,因为枚举类型本身没有下标,可以通过这种方式实现用索引找到内容

public static week valueOf(String name)

返回指定名称的内容

所以枚举类型的本质就是一个类


Enum:

Enum是所有枚举类型的父类,其中包含了对枚举类型进行控制,和操作的方法

他的构造器:

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

可以看到他使用protect就是为了给子类经常同时让其他的类无法实例对象实现枚举类型的特征
两个参数分别为: 名称,索引

而枚举类型的构造器如上面的week

private week(String s, int i)
{
	super(s, i);
}

可想而知super指的就是Enum构造器


以上便是枚举类型的大概用法,和本质,如有错误欢迎指正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,可以通过反射机制获取枚举类型。以下是获取Java所有枚举类型的示例代码: ```java import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class EnumExporter { public static void main(String[] args) { Class<?>[] classes = { MyEnum.class }; // 将要导出枚举类型的类 for (Class<?> cls : classes) { System.out.println("Enum Type: " + cls.getName()); if (cls.isEnum()) { Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { System.out.println("Enum Value: " + field.getName()); } } } System.out.println(); } } enum MyEnum { VALUE1, VALUE2, VALUE3 } } ``` 在这个例子,我们定义了一个 `EnumExporter` 类,它包含一个名为 `main` 的方法,该方法将要导出枚举类型的类作为参数,并使用反射机制获取该类的所有枚举类型。 在 `main` 方法,我们定义了一个 `MyEnum` 枚举类型的类,并将其作为参数传递给 `EnumExporter` 类的实例。然后,我们使用 `Class.isEnum()` 方法检查该类是否是枚举类型,如果是,则使用 `Class.getDeclaredFields()` 方法获取该类的所有字段,并在每个字段上使用 `Modifier.isStatic()` 方法检查该字段是否是静态字段(即枚举值)。如果是,则输出该字段的名称。 运行此程序将输出以下内容: ``` Enum Type: EnumExporter$MyEnum Enum Value: VALUE1 Enum Value: VALUE2 Enum Value: VALUE3 ``` 这表明 `MyEnum` 是一个枚举类型,并且它有三个枚举值:`VALUE1`、`VALUE2` 和 `VALUE3`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值