【Java进阶篇】Java中的枚举的概念、有什么特点和好处

2023-12-26 21:32:02

在这里插入图片描述

??枚举的概念


Java枚举是一种特殊的数据类型,它的每一个值都映射到Enum类的构造函数中,具有固定数量的常量值。枚举类型具有简洁、安全和便捷的特性。在Java中,枚举和类、接口的级别相同,可以包含属性、方法、构造方法等。使用enum关键字声明一个枚举类型时,就默认继承自Java中的java.lang.Enum类,并实现了java.lang.Seriablizable和java.lang.Comparable两个接口。所有的枚举值都是public static final的,且非抽象的枚举类不能再派生子类。枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。


Java中的枚举(Enum)是一种特殊的类,它被设计用来表示固定数量的常量。枚举在Java中提供了类型安全的方式来表示常量值。枚举可以包含方法、构造函数和初始化块,就像一个完全的类一样。

以下是Java枚举的二个简单示例:


//Demo1
public enum Season {
	SPRING,SUNNER,AUTUMN,WINER;
}

//Demo2
public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

在这个例子中,我们定义了一个名为Day的枚举,它有7个可能的值:星期日、星期一、星期二、星期三、星期四、星期五和星期六。

然后你可以像这样使用它:

Day day = Day.MONDAY;
System.out.println(day); // 输出 "MONDAY"

枚举还有其他一些有用的特性,例如:

  • 枚举常量默认按照它们在代码中出现的顺序进行排序。
  • 枚举可以包含方法和字段。例如,你可以为每个星期日定义一个字段,并为每个星期日定义一个方法。
  • 枚举支持序列化机制,这意味着枚举常量的序列化与反序列化操作是安全的。

??枚举的特点


Java枚举是一种特殊的数据类型,它是一组预定义的常量,每个常量都有一个名称和一个值。枚举类型在Java中被广泛使用,它可以用来代替常量、标志位、状态码等,使代码更加清晰、易读和易维护。以下是对Java枚举特点的详细解释:

  1. 类型安全性:枚举类型可以限制变量的值,从而避免了错误的赋值。
  2. 可读性:枚举类型的名称更加清晰明了,可以提高代码的可读性。
  3. 更好的维护性:枚举类型可以在编译时进行类型检查,可以更早发现问题。
  4. 更好的性能:枚举类型的值是在编译时确定的,因此在运行时访问枚举类型的值会更快。
  5. 更好的组织性:枚举类型可以帮助我们将相关的值组织在一起,使代码更加整洁。
  6. 可扩展性:枚举类型可以轻松地扩展或更新,而不会对其他部分的代码造成影响。
  7. 便于测试:枚举类型可以方便地进行测试,因为它有限且确定的值域。
  8. 支持多态:枚举类型可以支持多态,因为它是一种特殊的类。
  9. 支持构造器和方法:枚举类型支持构造器和方法,可以在其中定义额外的行为或属性。
  10. 具有单例性:枚举类型的每个实例都是唯一的,确保了单例性。
  11. 不可变性:枚举类型是不可变的,它的值在编译时就已经确定,不可更改。
  12. 实现了Comparable和Serializable接口:枚举类型实现了Comparable和Serializable接口,可以方便地进行比较和序列化。
  13. 更好的资源利用:枚举类型的值是在编译时确定的,因此使用枚举类型可以节省内存空间。
  14. 易于维护:枚举类型可以方便地维护和更新,因为它有限且确定的值域。

??枚举的好处


Java中枚举的好处如下:


  1. 枚举的ValueOf可以自动对入参进行非法参数的校验
  2. 可以调用枚举中的方法,相对于普通的常量来说操作性更强
  3. 枚举实现接口的话,可以很容易的实现策略模式
  4. 枚举可以自带属性,扩展性强。

??拓展知识仓


??枚举如何实现的?

如果我们使用反编译,对一个枚举进行反编译的话,就能大致了解他们的实现方式,如上面的Season枚举,反编译后内容如下:


public final class T extends Enum {
	private T(String s, int i) {
		super(s, i);
	}

	public static T[] values() {
		T at[];
		int i;
		T at1[];
		System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);
		return at1;
	}

	public static T valueOf(string s) {
		return (T)Enum.valueOf(demo/T,s);
	}

	public static final T SPRING;
	public static final T SUMMER;
	public static final T AUTUMN;
	public static final T WINTER;
	private static final T ENUMSVALUES[];

	static {
		SPRING = new  T("SPRING"0);
		SUMMER = new T("SUMMER"1);
		AUTUMN = new T("AUTUMN"2);
		WINTER = new T(WINTER",3);
		ENUM$VALUES = (new T[] {
		SPRINGSUMMERAUTUMNWINTER
		});
	}
}

通过反编译后代码我们可以看到,public final cass T extends Enum,说明,该类是继承了Enum类的,同时final关键字告诉我们,这个类也是不能被继承的。当我们使用enum来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承,我们看到这个类中有几个属性和方法。


枚举如何比较

枚举的equals方法底层用的还是==,所以两者都可以

文章来源:https://blog.csdn.net/Java_Yangxiaoyuan/article/details/135229172
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。