gpt4 book ai didi

java - Switch 语句并在静态 block 中初始化最终静态变量

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

对于我的项目,我将许多对象分成 10 个类。每个对象都可以执行一些操作,这些操作必须事先注册(每个类只注册一次操作)。为每个类定义的操作表示为 public final static 整数。我想在运行时动态分配操作的ID(每个类的操作数量目前是20个左右,数量会增加)。

问题出现了,当执行一个操作时,我必须找到正在执行的是哪个操作(我使用 switch 语句)。

这是一个简单的工作代码示例:

public class Test {
final static int foo = 8;
final static int bar = 10;

public static void main(String[] args)
{
int x=10;

switch(x)
{
case foo:
System.out.println("FOO");
break;
case bar:
System.out.println("BAR");
break;
default:
System.out.println("PROBLEM");
}
}
}

此代码正常编译并显示BAR

但是这个稍微转换的代码会产生一个 Unresolved 编译问题case expressions must be constant expressions

public class Test {
final static int foo;
final static int bar;

static
{
foo=8;
bar=10;
}
public static void main(String[] args)
{
int x=10;

switch(x)
{
case foo:
System.out.println("FOO");
break;
case bar:
System.out.println("BAR");
break;
default:
System.out.println("PROBLEM");
}
}
}

这些代码不应该实际工作和编译一样吗?在解决此问题之前,我无法动态执行任何操作?还是有别的办法?

谢谢

编辑:由于使用枚举的想法,我想解决这个问题:

public class Test {
enum OperationSet1 {
FOO, BAR, THESE, ARE, ALL, DIFFERENT, OPERATIONS
}
enum OperationSet2 {
FOO, BAR, NOW, SOME, OTHER, OPS
}

public static void main(String[] args) {
OperationSet1[] ops = new OperationSet1[10];
for (int i=0; i<ops.length; i++)
ops[i] = OperationSet1.values()[(int)(Math.random()*OperationSet1.values().length)];

OperationSet2[] ops2 = new OperationSet2[10];
for (int i=0; i<ops.length; i++)
ops[i] = OperationSet2.values()[(int)(Math.random()*OperationSet2.values().length)];

for (OperationSet1 op:ops)
handleOperation(op);
}
for (OperationSet2 op:ops2)
handleOperation(op);
}
public static void handleOperation(Object? op) {
switch(op) {
/**code to handle**/
}
}
}

我们有两个枚举,我想要一个处理函数(最好使用 switch 语句),它可以处理这两个枚举中出现的所有情况。

编辑2:所以就这样吧。我有 10 个类 (C1, C2, ..., C10) 和这些类的大约 40 个对象。其中一些对象是所谓的所有者,一些是共享的。每个共享对象都有一个所有者(这是基本关系 - 它与 java 继承没有任何关系)。

现在每个共享对象obj都会不时发生变化,而这个obj需要询问它的所有者own是否可能发生变化(这只是其中一个操作)然后它发生变化(并再次通知所有者)。对象 obj 也有一组预定义的操作,他可以​​执行这些操作,由 enumC1 中定义。因此own 必须具有类C1 的对象操作的处理函数。现在我们有一个对象 obj2,它属于 C2 类,具有不同的操作集和相同的所有者 ownobj 只能执行 C1 中定义的操作,obj2 只能执行 C2 中定义的操作。

如何泛化处理函数使其写得整齐?我应该使用枚举吗?

最佳答案

您只能在 switch 语句中使用编译时已知的常量。这是因为开关代码是静态检查和构建的。

在第二种情况下你可以做

static
{
foo=8;
bar=foo;
}

但由于这些值直到运行时才知道,因此无法构建 switch 语句或检查它是否正确。

关于java - Switch 语句并在静态 block 中初始化最终静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248840/

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