切换语句并在静态块中初始化最终的静态变量

Nej*_*ejc 5 java static final switch-statement

对于我的项目,我有很多对象分为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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码通常编译和显示BAR.

但是,这稍微变换代码就会产生Unresolved compilation problemcase 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些代码实际上不应该工作并编译相同吗?在解决此问题之前,我无法动态执行任何操作?或者是其他任何方式?

谢谢

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

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**/
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在每个共享对象都会obj不时更改,这obj需要询问其所有者own是否可以更改(这只是其中一个操作),然后更改(并再次通知所有者).对象obj还具有一组预定义的操作,他可以​​执行这些操作,C1由a 定义enum.因此own必须具有类的对象操作的处理函数C1.现在我们有一个obj2类的对象C2,具有不同的操作集和相同的所有者own.obj可以仅执行在中定义的操作,C1并且obj2可以仅执行在中定义的操作C2.

如何概括处理功能,以便整齐地编写?我应该使用枚举吗?

Pet*_*rey 4

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

在第二种情况下你可以这样做

static
{
    foo=8;
    bar=foo;
}
Run Code Online (Sandbox Code Playgroud)

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