私のプロジェクトでは、多くのオブジェクトが 10 個のクラスに分割されています。各オブジェクトは、事前に登録する必要があるいくつかの操作を実行する場合があります (操作の登録は、クラスごとに 1 回だけ行われます)。各クラスに定義された操作は、public final static
整数として表されます。実行時にオペレーションの ID を動的に割り当てたい (1 クラスあたりのオペレーションの数は現在約 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
。
しかし、このわずかに変換されたコードは with を生成Unresolved compilation problem
し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**/
}
}
}
2 つの列挙型があり、これら 2 つの列挙型に現れるすべてのケースを処理する 1 つの処理関数 (できれば switch ステートメントを使用) が必要です。
EDIT2:ここに行きます。10 個のクラス(C1, C2, ..., C10)
と、これらのクラスの約 40 個のオブジェクトがあります。これらのオブジェクトには、いわゆる所有者と共有されるものがあります。各共有オブジェクトには所有者がいます (これは基本的な関係であり、Java の継承とは関係ありません)。
現在、各共有オブジェクトobj
は時々変更されるためobj
、所有者own
に変更の可能性があるかどうかを確認する必要があり (これは操作の 1 つにすぎません)、変更されます (所有者に再度通知します)。オブジェクトには、によって定義されたobj
、実行できる事前定義された一連の操作もあります。したがって、クラス のオブジェクト操作の処理関数が必要です。これで、クラスが異なり、操作のセットが異なり、所有者が同じオブジェクトができました。で定義された操作のみを実行でき、 で定義された操作のみを実行できます。C1
enum
own
C1
obj2
C2
own
obj
C1
obj2
C2
きちんと書かれるように処理関数を一般化する方法は? 列挙型を使用する必要がありますか?