首页 > Java > java教程 > Java 中的枚举是什么?

Java 中的枚举是什么?

Mary-Kate Olsen
发布: 2025-01-03 00:17:08
原创
163 人浏览过

¿Qué son los enums en Java?

在Java中枚举或枚举是一种特殊类型的类,它表示一组常量(不可变值),即一组不随时间变化的固定值,因此所有可能的值在编译时都是已知的,例如一周中的几天、一年中的月份、颜色等。

由于枚举是类的一种类型,您可能会认为我们需要实例化它才能使用它,但是,这不是必需的,尽管它具有与普通类相同的功能,例如属性、方法、构造函数和即使实现接口,唯一的考虑是不能在枚举中实现继承的概念。它的主要目标是定义我们自己的数据类型(枚举数据类型)。枚举需要突出显示的一些属性是:

  • 每个枚举在内部都使用类类型实现为一个类。
  • 枚举的每个常量代表一个枚举类型的对象。
  • 所有枚举都隐式扩展 java.lang.Enum,因为类只能从父类扩展,枚举不能从另一个类扩展。
  • 枚举中的每个常量都隐式属于 public static final 类型。
  • 它们可以用于控制结构,例如开关。
  • main() 方法可以在枚举内声明。
  • 重写 toString() 方法以返回常量的名称。

枚举的声明

我们可以在类内部或外部声明枚举,或者在单独的文件中声明枚举,但不能在方法内部声明枚举。声明枚举的语法如下:

enum NombreEnum {
    CONSTANTE1, CONSTANTE2, CONSTANTE3, ...
}
登录后复制
登录后复制
登录后复制

按照惯例,枚举的常量以大写字母书写。
通常,枚举的第一行是常量的声明,如有必要,后面是属性、方法和构造函数。

// Enum declarado fuera de una clase
enum Color {
    RED, GREEN, BLUE;
}

public class Main {
    public static void main(String[] args) {}
}
登录后复制
登录后复制
登录后复制
// Enum declarado dentro de una clase
public class Main {
    public static void main(String[] args) {}

    enum Color {
        RED, GREEN, BLUE;
    }
}
登录后复制
登录后复制
登录后复制

要访问枚举的任何常量,我们只需使用枚举名称,后跟句点和常量名称。

Color color = Color.RED;
登录后复制
登录后复制
登录后复制

这可能不是那么必要,但是如果我们需要获取常量声明时的名称,我们可以使用 name() 方法,尽管有时 toString() 方法会省略它以备我们需要更具描述性的东西。

System.out.println(Color.RED.name()); // RED
System.out.println(Color.RED); // RED
登录后复制
登录后复制
登录后复制

从枚举中获取常量

我们可以使用values()方法获取枚举的所有常量,该方法返回一个包含所有常量的数组。

enum NombreEnum {
    CONSTANTE1, CONSTANTE2, CONSTANTE3, ...
}
登录后复制
登录后复制
登录后复制

如果我们需要根据常量的名称获取常量,无论是因为我们接收它作为输入,还是从文件或数据库获取它,我们都可以使用 valueOf() 方法,我们只需要考虑这个方法区分大小写,因此如果名称与任何常量不匹配,则会抛出 IllegalArgumentException。

// Enum declarado fuera de una clase
enum Color {
    RED, GREEN, BLUE;
}

public class Main {
    public static void main(String[] args) {}
}
登录后复制
登录后复制
登录后复制

之前,我们看到了如何以数组的形式获取所有常量,所以你可能会想是否可以获取常量的索引,答案是可以的,我们可以使用ordinal()方法来获取常量的索引,就像在数组中索引从零开始一样。

// Enum declarado dentro de una clase
public class Main {
    public static void main(String[] args) {}

    enum Color {
        RED, GREEN, BLUE;
    }
}
登录后复制
登录后复制
登录后复制

在开关上使用枚举

使用枚举的优点之一是我们可以在 switch 控制结构中使用它,这使我们能够简化代码并使其更具可读性。

Color color = Color.RED;
登录后复制
登录后复制
登录后复制

枚举中的属性和构造函数

枚举的每个常量都可以有自定义属性,就像在普通类中一样,只需要考虑必须有一个初始化属性的构造函数,这样在加载常量时,就会隐式调用相应的构造函数。知道声明中每个常量都是 enum 类型的对象,我们必须根据构造函数传递属性的值。

System.out.println(Color.RED.name()); // RED
System.out.println(Color.RED); // RED
登录后复制
登录后复制
登录后复制

对于这个枚举,我们有 3 个常量,每个常量都有 3 个属性,名称、级别和描述,此外还有一个所有常量通用的 code 属性,但它不需要在构造函数中初始化,因为它是一个常数值。每个属性可以有不同的访问修饰符,这完全取决于我们的需求。

枚举中的方法

考虑到前面的示例,我们可以推断,由于每个属性都是 private 类型,我们需要一种方法来访问它们,因此我们可以为每个属性声明 getter 方法。

Color[] colors = Color.values();

for (Color color : colors) {
    System.out.println(color);
}
登录后复制

我们还可以在枚举中声明实用方法,例如允许我们根据级别获取常量的方法。您只需考虑该方法必须是静态的,因为我们无法实例化枚举。

enum NombreEnum {
    CONSTANTE1, CONSTANTE2, CONSTANTE3, ...
}
登录后复制
登录后复制
登录后复制

枚举中的抽象方法

我们已经了解了如何在枚举中实现方法,但是如果我们需要每个常量以不同的方式实现方法,我们可以声明一个抽象方法,并且每个常量必须以自己的方式实现它,考虑到语法常量的声明略有变化。例如,我们声明一个抽象方法 showPermissions(),它通过控制台打印每个常量的权限。

// Enum declarado fuera de una clase
enum Color {
    RED, GREEN, BLUE;
}

public class Main {
    public static void main(String[] args) {}
}
登录后复制
登录后复制
登录后复制

枚举中的接口

枚举可以实现一个或多个接口,与普通类一样,只需要用逗号分隔接口即可。

// Enum declarado dentro de una clase
public class Main {
    public static void main(String[] args) {}

    enum Color {
        RED, GREEN, BLUE;
    }
}
登录后复制
登录后复制
登录后复制

EnumSet 和 EnumMap

Java 提供了两个类来处理枚举,EnumSet 和 EnumMap,它们分别比 HashSet 和 HashMap 类更高效,因为它们是为处理枚举而设计的。 EnumSet 是枚举的唯一元素的集合,而 EnumMap 是使用枚举作为键的 Map 实现。

Color color = Color.RED;
登录后复制
登录后复制
登录后复制

完整示例

我们已经了解了枚举的不同特征,现在让我们看一个使用所有这些特征的示例。

System.out.println(Color.RED.name()); // RED
System.out.println(Color.RED); // RED
登录后复制
登录后复制
登录后复制

结论

枚举是 Java 中非常有用的功能,因为它们允许我们定义自己的数据类型,这有助于我们使代码更具可读性和可维护性,并允许我们更有效地使用常量。虽然它不是一个新功能,但了解它并知道如何使用它很重要,因为在很多情况下它可以帮助我们简化我们的代码。

以上是Java 中的枚举是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板