gpt4 book ai didi

java - Java 中枚举值的可见性

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:01 24 4
gpt4 key购买 nike

是否有可能以某种方式将 Java 中的某些 enum 值标记为包私有(private)的,即给它们 default 修饰符?

背景(只是为了抢占第一条评论“为什么?”;))

我有一个 Task 对象,它具有不同的执行方法和决定下一步调用哪个方法的执行状态。每个执行方法都会返回下一个要调用的方法的执行状态(基本上是一个用于执行状态机的框架)。

我有一个 enum,它包含所有可能的执行状态,但也包含一些“包内部”状态,如“待处理”或“失败”,执行不应返回这些状态-方法。

我知道我可以在一个单独的变量中用它自己的枚举来管理这些状态,但这会使代码变得不那么干净,因为它将单个 switch 语句变成(至少)两个(可能还有周围的 if)。此外,我当然可以只检查返回值,但我宁愿一开始就不要提供错误的值。

最佳答案

听起来简单的答案是“否”。

但是,考虑到不同的评论和答案(特别是 Marcelo、BlackVegetable 和 OldCurmudgeon 的评论和答案),我想出了以下解决方法:

package-private 枚举包含所有值:

enum PackagePrivateEnum {
PUBLIC_VALUE_1,
PUBLIC_VALUE_2,
PUBLIC_VALUE_3,
PACKAGE_PRIVATE_VALUE_1,
PACKAGE_PRIVATE_VALUE_2;
}

第二个 public 枚举只包含公共(public)值,并将它们直接映射到包私有(private)值:

public enum PublicEnum {
PUBLIC_VALUE_1 (PackagePrivateEnum.PUBLIC_VALUE_1),
PUBLIC_VALUE_2 (PackagePrivateEnum.PUBLIC_VALUE_2),
PUBLIC_VALUE_3 (PackagePrivateEnum.PUBLIC_VALUE_3);

final PackagePrivateEnum value;

private PublicEnum(PackagePrivateEnum value) {
this.value = value;
}
}

现在,如果我有一个只允许返回公共(public)值之一的函数,我将其定义为:

public abstract PublicEnum returnSomething();

然后可以通过以下方式在包中使用它:

PackagePrivateEnum value = returnSomething().value;

这对公众隐藏了不需要的值,我相信,同时最大限度地减少了包内的编码和性能开销(例如,没有 switch 或 if 语句,没有 Map 查找等,只是一个 .value 必需)。事实上,使用像 GWT 这样的智能编译器,返回值可能应该“内联”到甚至完全删除 .value-lookup 的程度,即根本没有性能开销。

另外,有了这个,可以为不同的上下文定义一个大集合枚举的任意数量的不同允许子集:我可以轻松定义另一个公开一组完全不同的值的 PublicEnum2来自 PackagePrivateEnum

关于java - Java 中枚举值的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17815592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com