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

标签 java static switch-statement final

对于我的项目,我将许多对象分成 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/

相关文章:

objective-c - 在 Objective-C 中定义静态常量值的类

c - 在 C 程序中出现两个错误

设置为属性时,Swift 枚举会丢失初始化值吗?

string - 从分隔字符串构建对象的最佳方法(希望不是循环情况)

java - 如何使用匹配器知道是否有不需要的字符?

java - 是否可以在运行时禁用android 6请求权限并使其从AndroidManifest正常工作?

java - 如何巧妙地克服静态属性不能被覆盖的事实?

java - 设置 JTextField 在 JRadioButton Click 上可见

Java - 将动态 JSON 映射到 DTO

php - 为什么 PHP 5.2+ 不允许抽象静态类方法?