gpt4 book ai didi

Java Enums : Two enum types, 每个都包含对彼此的引用?

转载 作者:IT老高 更新时间:2023-10-28 21:06:18 29 4
gpt4 key购买 nike

有没有办法解决由于两个枚举相互引用而导致的类加载问题?

我有两组枚举,Foo 和 Bar,定义如下:

public class EnumTest {

public enum Foo {
A(Bar.Alpha),
B(Bar.Delta),
C(Bar.Alpha);

private Foo(Bar b) {
this.b = b;
}

public final Bar b;
}

public enum Bar {
Alpha(Foo.A),
Beta(Foo.C),
Delta(Foo.C);

private Bar(Foo f) {
this.f = f;
}

public final Foo f;
}

public static void main (String[] args) {
for (Foo f: Foo.values()) {
System.out.println(f + " bar " + f.b);
}
for (Bar b: Bar.values()) {
System.out.println(b + " foo " + b.f);
}
}
}

以上代码作为输出产生:

A bar Alpha
B bar Delta
C bar Alpha
Alpha foo null
Beta foo null
Delta foo null

我明白为什么会发生 - JVM 开始类加载 Foo;它在 Foo.A 的构造函数中看到了 Bar.Alpha,所以它开始类加载 Bar。它在对 Bar.Alpha 的构造函数的调用中看到了 Foo.A 引用,但是(因为我们仍在 Foo.A 的构造函数中)此时 Foo.A 为空,因此 Bar.Alpha 的构造函数传递了一个空值。如果我反转两个 for 循环(或以其他方式在 Foo 之前引用 Bar),输出会发生变化,因此 Bar 的值都是正确的,但 Foo 的值不是。

有没有办法解决这个问题?我知道我可以在第三堂课中创建一个静态 map 和一个静态 map ,但这对我来说感觉相当骇人。我还可以创建引用外部映射的 Foo.getBar() 和 Bar.getFoo() 方法,因此它甚至不会更改我的接口(interface)(我使用的实际类使用检查器而不是公共(public)字段),但它仍然感觉对我来说有点不干净。

(我在实际系统中这样做的原因:Foo 和 Bar 表示 2 个应用程序相互发送的消息类型;Foo.b 和 Bar.f 字段表示给定消息的预期响应类型 -所以在我的示例代码中,当 app_1 收到 Foo.A 时,它需要回复 Bar.Alpha,反之亦然。)

提前致谢!

最佳答案

最好的方法之一是使用枚举多态技术:

public class EnumTest {
public enum Foo {
A {

@Override
public Bar getBar() {
return Bar.Alpha;
}
},
B {

@Override
public Bar getBar() {
return Bar.Delta;
}
},
C {

@Override
public Bar getBar() {
return Bar.Alpha;
}
},

;

public abstract Bar getBar();
}

public enum Bar {
Alpha {

@Override
public Foo getFoo() {
return Foo.A;
}
},
Beta {

@Override
public Foo getFoo() {
return Foo.C;
}
},
Delta {

@Override
public Foo getFoo() {
return Foo.C;
}
},

;

public abstract Foo getFoo();
}

public static void main(String[] args) {
for (Foo f : Foo.values()) {
System.out.println(f + " bar " + f.getBar());
}
for (Bar b : Bar.values()) {
System.out.println(b + " foo " + b.getFoo());
}
}
}

上面的代码产生你想要的输出:

A bar Alpha
B bar Delta
C bar Alpha
Alpha foo A
Beta foo C
Delta foo C

另见:

关于Java Enums : Two enum types, 每个都包含对彼此的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506410/

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