在Java中枚举或枚举是一种特殊类型的类,它表示一组常量(不可变值),即一组不随时间变化的固定值,因此所有可能的值在编译时都是已知的,例如一周中的几天、一年中的月份、颜色等。
由于枚举是类的一种类型,您可能会认为我们需要实例化它才能使用它,但是,这不是必需的,尽管它具有与普通类相同的功能,例如属性、方法、构造函数和即使实现接口,唯一的考虑是不能在枚举中实现继承的概念。它的主要目标是定义我们自己的数据类型(枚举数据类型)。枚举需要突出显示的一些属性是:
我们可以在类内部或外部声明枚举,或者在单独的文件中声明枚举,但不能在方法内部声明枚举。声明枚举的语法如下:
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; } }
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中文网其他相关文章!