📜  比较Java中的枚举成员

📅  最后修改于: 2022-05-13 01:55:35.012000             🧑  作者: Mango

比较Java中的枚举成员

先决条件: Java中的枚举,== vs等于

在Java中,枚举是一种特殊的Java类型,用于定义常量集合。更准确地说, Java枚举类型是一种特殊的Java类。一个枚举可以包含常量、方法等。枚举可以定义为一组命名常量。

有两种方法可以比较枚举成员:

  • 通过使用 ==运算符
  • 通过使用 equals() 方法

equals 方法在内部使用 ==运算符来检查两个枚举是否相等。这意味着,您可以使用 == 和 equals 方法比较 Enum。但问题是,如果我们有两种方法来比较枚举的两个成员,那么哪一种更好?

==运算符和 .equals() 方法都仅用于比较。但是有一些区别:

  • ==运算符从不抛出 NullPointerException,而 .equals() 方法可以抛出 NullPointerException。
  • == 负责在编译时进行类型兼容性检查,而 .equals() 方法永远不会担心两个参数的类型。

让我们看一下这些程序以更好地理解:

// Java program to illustrate enum members comparison
class EnumDemo {
    public enum Day { MON,
                      TUE,
                      WED,
                      THU,
                      FRI,
                      SAT,
                      SUN }
    public static void main(String[] args)
    {
        Day d = null;
  
        // Comparing an enum member with null
        // using == operator
        System.out.println(d == Day.MON);
  
        // Comparing an enum member with null
        // using .equals() method
        System.out.println(d.equals(Day.MON));
    }
}

输出:

false
Exception in thread "main" java.lang.NullPointerException

说明:在上面的程序中,我们将枚举成员与空值进行比较。当我们使用 ==运算符进行比较时,我们不会得到任何异常,而当我们使用 .equals() 方法时,我们会得到 NullPointerException。
因此我们可以得出结论,当我们使用 ==运算符进行枚举成员比较时,它不会抛出任何异常,但 .equals() 方法会抛出异常。

另一个例子:

// Java program to illustrate enum members comparison
class EnumDemo {
    public enum Day { MON,
                      TUE,
                      WED,
                      THU,
                      FRI,
                      SAT,
                      SUN }
    public enum Month { JAN,
                        FEB,
                        MAR,
                        APR,
                        MAY,
                        JUN,
                        JULY }
    public static void main(String[] args)
    {
        // Comparing two enum members which are from different enum type
        // using == operator
        System.out.println(Month.JAN == Day.MON);
  
        // Comparing two enum members which are from different enum type
        // using .equals() method
        System.out.println(Month.JAN.equals(Day.MON));
    }
}

输出:

error: incomparable types: Month and Day

说明:在上面的程序中,我们将一个枚举成员与另一个枚举成员进行比较。当我们使用 .equals() 方法进行比较时,我们不会得到任何 Compilation Failure(CF) 而当我们使用 ==运算符时,我们会得到 Compilation Failure(CF) 说“无法比较的类型”。因此我们可以得出结论,当我们使用 ==运算符进行枚举成员比较时,它会在编译时执行类型兼容性检查,而 .equals() 方法永远不会担心两个参数的类型(它只会给出“false”表示无法比较类型)。