这是 Java 中正确的枚举做法吗?

Is this proper enum practice in Java?

我刚开始在 Java 学习枚举,虽然这个概念看起来很简单,但它的应用对我来说并不是很直观。我看到我可以将枚举放在 classes 中,尽管它们本身就是 classes。

我也在网上看到有人说你只能在一个 class 中有一个枚举,或者你不应该将所有枚举放在一个 class 中,除非它们是私有的。

所以,我有点疑惑,这段代码是不是enum的正确写法?

谢谢。

public class AirCraft 
{
    private AirType type;
    private AirFixTime maintainTime;
    
    private enum AirType
    {
        HELICOPTER,
        AIRLINE,
        BALLOON,
        GLIDER;
    }
    
    private enum AirFixTime
    {
        WEEKLY,
        MONTHLY,
        YEARLY;
    }
}

从技术上讲,您的代码编写正确。枚举的使用取决于功能。请记住,访问修饰符用于管理您要与他人分享或展示的内容。现在,如果枚举仅在 AirCraft 内部使用,那么您的代码是正确的。

看看this

您可以选择三个位置来放置枚举定义。

  • Class 自己的。
  • 嵌套在另一个 class.
  • 本地,在方法内(Java 16,现已在 Java 15 中预览)

上下文是关键

您可以将您的枚举定义放在对您有意义的任何地方。这完全取决于上下文。

  • 如果您的枚举要在其他代码中单独使用,请将枚举放在它自己的 class 中。
  • 如果枚举真的只有在 特别是 class,然后嵌套枚举。
    • 如果枚举对象仅在父级 class 自己的源代码中使用,则进行枚举定义 private.
    • 如果外部代码可能使用枚举对象来处理父对象 class,请将嵌套 class public。例如,报告建筑 class 可能希望根据分配的 AirCraft.Color 枚举对象对飞机部件进行排序,以将所有 safety-orange 部件聚集在一起。

例如,考虑 MonthDayOfWeek 枚举 classes 内置于 Java 作为 java.time[ 的一部分=87=] classes。这些枚举定义存在于它们自己单独的 classes 中,因为它们可以在许多不同的上下文中使用,而无需其他 java.time classes .这些枚举可以在工作流应用程序、销售报告、会计应用程序等中单独使用。

相比之下,想象一个 UI 框架跟踪鼠标事件。在那里我们可能会找到一个 Event 鼠标事件枚举,定义名为 HOVERCLICKEDDRAGGED 的对象。这个枚举最好放在 Mouse class 中,因为它只在外部鼠标处理 class.

的上下文中有意义

另一个例子,颜色。

  • 列出所有 the standard colors named in Cascading Style Sheets (CSS) 的枚举应该在它自己的 class 中,因为许多类型的代码都可能使用它。
  • 用于飞机颜色编码部件的枚举颜色应嵌套在 AirCraft class 中,它是唯一合理的上下文。

用法:

myWebPage.setBackground( CssColor.DARK_SLATE_GREY ) ;  // This enum could be used on its own with many classes in different frameworks. So define enum in a separate class..

myAircraft.getEmergencyStopButton().setColor( AirCraft.Color.SAFETY_ORANGE ) ;  // This enum is only ever used in contexts using its parent class, so nest the enum definition. 

如果嵌套,请考虑您的命名。我可能会将枚举命名为 Color 而不是 AircraftColor,因为嵌套符号 AirCraft.Color.x 明确了上下文。另一方面,有些人喜欢使用 static import 来使用 Color.x without the AirCraft. prefix(不是我的偏好)。

本地枚举

Java 16 中的新功能将是本地枚举(在 Java 15 中预览)。这意味着在方法中定义枚举。

此新功能似乎仅作为新记录功能中的提及记录在案:JEP 384: Records (Second Preview)

private void demoLocalEnum ( )
{
    enum Color { PURPLE , SAFETY_ORANGE }
    System.out.println( Color.PURPLE ) ;
}

正如我们在此屏幕截图中所见,枚举仅存在于包含其声明的方法中。同一个 class 上的兄弟方法不知道枚举的存在。在此示例中,尝试在另一个方法中使用枚举会在 IDE 的代码编辑器中产生错误。

在您的枚举仅在一段代码中有意义的地方使用它。如果您的枚举仅在单个方法中使用,那么将其声明为嵌套的 class 会引起不必要的注意。藏在那个方法里更整洁。