这是 Java 中正确的枚举实践吗?

问题描述 投票:0回答:2

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

我还在网上看到有人说你在一个类中只能有一个枚举,或者你不应该将所有枚举放在一个类中,除非它们被设置为私有。

因此,我有点困惑,这段代码是否是 enum 的正确写法?

谢谢。

public class AirCraft 
{
    private AirType type;
    private AirFixTime maintainTime;
    
    private enum AirType
    {
        HELICOPTER,
        AIRLINE,
        BALLOON,
        GLIDER;
    }
    
    private enum AirFixTime
    {
        WEEKLY,
        MONTHLY,
        YEARLY;
    }
}
java class oop enums access-modifiers
2个回答
4
投票

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

看看这个


2
投票

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

  • 有自己的类别。
  • 嵌套在另一个类中。
  • 本地方法内(Java 16+)

上下文是关键

您可以将枚举定义放在对您有意义的任何位置。这一切都取决于上下文。

  • 如果您的枚举要在其他代码中单独使用,请将枚举放入其自己的类中。
  • 如果枚举真的只有在上下文中使用时才有意义 特定的类,然后嵌套枚举。
    • 如果枚举对象仅在父类自己的源代码中使用,请进行枚举定义
      private
    • 如果枚举对象可能被处理父类对象的外部代码使用,请创建嵌套类
      public
      。例如,报告构建类可能希望按指定的
      AirCraft.Color
      枚举对象对飞机部件进行排序,以将所有 安全橙色 部件收集在一起。

例如,考虑将 Java 中内置的

Month
DayOfWeek
枚举类作为 java.time 类的一部分。这些枚举定义存在于它们自己单独的类中,因为它们可以在许多不同的上下文中使用,而不涉及其他java.time类。这些枚举可以在工作流程应用程序、销售报告、会计应用程序等中单独使用。

相比之下,想象一个跟踪鼠标事件的 UI 框架。在那里我们可能会找到鼠标事件的

Event
枚举,定义名为
HOVER
CLICKED
DRAGGED
的对象。该枚举最好位于
Mouse
类中,因为它仅在外部鼠标处理类的上下文中有意义。

另一个例子,颜色。

  • 列出在层叠样式表 (CSS) 中命名的所有标准颜色的枚举应该位于其自己的类中,因为许多类型的代码都可能使用它。
  • 列出飞机颜色编码部分中使用的颜色的枚举应该嵌套在
    AirCraft
    类中,这是它唯一合理的上下文。

用途:

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
而无需使用
AirCraft.
前缀
(不是我的偏好)。

本地枚举

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

此新功能似乎仅作为新记录功能中的提及进行记录:JEP 384:记录(第二次预览)

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

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

在您的枚举仅在一段代码中有意义的情况下使用此选项。如果您的枚举仅在单个方法中使用,那么将其声明为嵌套类会引起不必要的注意。隐藏在该方法中更整洁。

© www.soinside.com 2019 - 2024. All rights reserved.