gpt4 book ai didi

java - 使用 Java Enums 模拟 C++ 枚举整数

转载 作者:行者123 更新时间:2023-12-01 17:38:30 25 4
gpt4 key购买 nike

我正在尝试将一些 C++ 代码转换为 Java。我正在寻找在 Java 中模拟这种类型的 C++ 范例的最佳方法——我认为枚举可能是答案,但我对任何事情都持开放态度

C++ 代码:

typedef UInt32 Type;
enum { UNKNOWN, QUIT, SYSTEM, TIMER, LAST }
...
Type newType = UNKNOWN;
Type nextType = LAST + 1;
...
// "Register" the new type
newType = nextType;
nextType++;
...
switch (newType) {
case UNKNOWN:
case QUIT:
...
case LAST:
// Ignore unset or predefined types
default:
// Some type other than the predefined. Do something special

本质上,我正在寻找一种“扩展”Java 枚举值的方法。

enum Type { UNKNOWN, QUIT, SYSTEM, TIMER, LAST } 

不会放弃它。

我喜欢为强类型创建一个新对象的想法。

我再次寻找在这里使用的最佳模式。我可以轻松地通过一些 public static final int UNKNOWN 等来漂浮

最佳答案

Java 枚举的一个优点是,它们本质上是像所有其他枚举一样的对象。特别是,您可以在常量上使用方法,并使枚举实现接口(interface):

interface Useful {
void doStuff();
}

enum Foo implements Useful {
DEFAULT {
public void doStuff() {
...
}
},
MAGIC {
public void doStuff() {
...
}
}
}

因此,您的方法可以接受接口(interface)的任何实现,而不是采用枚举类型的参数,特别是通过让枚举常量实现所需的任何内容来提供默认内容。

他们也可以有成员:

enum Explicit {
FIRST(0), SECOND(1), THIRD(2);

private final int value;

private Explicit(int v) {
this.value = v;
}
}

请注意,常量有一个内部数值(反射(reflect)常量在其同级中的位置),可以使用 ordinal 方法访问该值:

assert Explicit.FIRST.ordinal() == 0;

但是依赖这个有点危险。如果您要(比如说)将枚举常量保留在数据库中,那么以下更改将破坏代码:

enum Explicit {
FIRST(0), NEWELT(-1), SECOND(1), THIRD(2);

private final int value;

private Explicit(int v) {
this.value = v;
}
}

使用序数值时。因此,序列化机制在序列化枚举值时使用常量的名称而不是其位置。

所以:

Type.X + 1

将是

Enum.values()[Enum.X.ordinal() + 1]

并且可以使用枚举本身实现的接口(interface)来对 switch 进行建模(您可以在 Java 中的 switch 语句中使用枚举,但通常,使枚举实现必要的代码会产生更易于维护的代码)

关于java - 使用 Java Enums 模拟 C++ 枚举整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868181/

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