当前位置: 首页 > 知识库问答 >
问题:

使用enum的序号是一种好的做法吗?

施华奥
2023-03-14

我有一个枚举:

public enum Persons {

    CHILD,
    PARENT,
    GRANDPARENT;

}

在枚举成员之间使用顺序()方法检查“层次结构”有什么问题吗?我的意思是-当有人将来可能会意外更改顺序时,使用它排除冗长是否有任何缺点。

还是这样做更好:

public enum Persons {

    CHILD(0),
    PARENT(1),
    GRANDPARENT(2);

    private Integer hierarchy;

    private Persons(final Integer hierarchy) {
        this.hierarchy = hierarchy;
    }

    public Integer getHierarchy() {
        return hierarchy;
    }

}

共有3个答案

邵绪
2023-03-14

第一种方法不是直接可以理解的,因为您必须阅读用于枚举的代码才能理解枚举的顺序很重要。
它非常容易出错。

public enum Persons {

    CHILD,
    PARENT,
    GRANDPARENT;

}

第二种方法更好,因为它不言而喻:

CHILD(0),
PARENT(1),
GRANDPARENT(2);

private SourceType(final Integer hierarchy) {
    this.hierarchy = hierarchy;
}

当然,枚举值的顺序应该与枚举构造函数参数提供的层次顺序一致

它引入了一种冗余,因为枚举值和枚举构造函数的参数都传递了它们的层次结构<但是为什么会有问题呢
枚举被设计为表示常量且不经常更改的值
OP enum用法很好地说明了一个很好的enum用法:

CHILD, PARENT, GRANDPARENT

枚举不是为了表示经常移动的值而设计的。
在这种情况下,使用枚举可能不是最佳选择,因为它可能会经常破坏使用它的客户端代码,此外,它会强制在每次修改枚举值时重新编译、重新打包和重新部署应用程序。

司易安
2023-03-14

正如Joshua Bloch在《有效Java》中所建议的那样,从枚举的序号中派生与枚举关联的值不是一个好主意,因为更改枚举值的顺序可能会破坏编码的逻辑。

您提到的第二种方法完全遵循作者的建议,即将值存储在单独的字段中。

我想说,您建议的替代方案肯定更好,因为它更具可扩展性和可维护性,因为您正在解耦枚举值的顺序和层次结构的概念。

雷国兴
2023-03-14

TLDR:不,你不应该!

如果您在E中引用序数方法的javadocnum.java:

大多数程序员都不会使用这种方法。它设计用于复杂的基于枚举的数据结构,如java。util。枚举集和java。util。枚举映射。

首先-阅读手册(在本例中为javadoc)。

其次,不要编写脆弱的代码。枚举值将来可能会更改,您的第二个代码示例更加清晰和易于维护。

如果在PARENTGRANDPARENT之间插入了新的枚举值,您绝对不希望为未来造成问题。

 类似资料:
  • 我有一个IntentService,它使用TimerTask每隔45秒在OnHandleContent中调用webservice。 我的问题是:我正在调用应用程序启动IntentService,而在OnHandleIntent中,由于TimerTask,任务不断重复。。这样做是一种好做法还是有任何缺点?我应该在我的活动中使用报警管理器每次调用intent service,还是继续使用timer任务

  • 我见过很多次scala代码使用Option(对于简单值)或[List[Error],T]来处理错误。 这为这样的代码提供了位置 这会产生一个不太好的代码嵌套,迫使您处理每一步的失败,并迫使您让所有函数返回一个[...] 所以我想知道 > 在scala(或一般的函数式编程)中不鼓励使用异常 使用它们有任何缺点(关于不可变性或代码并发性) 异常与原理或函数式编程有些冲突 你可以想出一个更好的方法来编写

  • 问题内容: 我有一个枚举: 使用方法检查枚举成员之间的“层次结构” 是否存在问题?我的意思是-使用它时,除了冗长之外,还有什么缺点吗?将来有人可能会意外更改顺序。 还是做这样的事更好: 问题答案: TLDR:不,您不应该! 如果您参考javadoc中的方法: 大多数程序员都不会使用这种方法。它设计用于复杂的基于枚举的数据结构,例如和。 首先-阅读手册(在这种情况下为javadoc)。 其次-不要编

  • 问题内容: 如果使用Sun的专有Java类,则编译器将显示警告。我认为使用这些类通常不是一个好主意。我在某处阅读过。但是,除了警告之外,还有其他根本原因不建议您使用它们? 问题答案: 因为它们是内部API,所以它们可能会以未记录或不受支持的方式进行更改,并且已绑定到特定的JRE / JDK(在您的情况下为Sun),从而限制了程序的可移植性。 尽量避免使用此类API,请始终偏爱公开记录和指定的类。

  • 这在本质上不像那样工作吗?使用它甚至是好的实践吗?这让我很不安。

  • 在Android上,有两种可能的方式通过广播接收器收听系统事件: 静态地,通过清单 由于一些项目包含大量活动、服务和“管理器”类,因此使用一个BroadcastReceiver通知应用程序上的所有侦听器所发生的事情,而不是使用多个BroadcastReceiver(以及它们的代码处理),可能会很有用。 这种广播接收器的一个示例是侦听连接更改的接收器: 目的是在应用程序处于活动状态时(通过服务和/或