6

私のプロジェクトでは、多くのオブジェクトが 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 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");
        }
    }
}

これらのコードは実際に動作し、同じようにコンパイルされるべきではありませんか? この問題を解決するまで動的に何かを行うことはできませんか? それとも他の方法ですか?

ありがとう

編集:列挙型を使用するためのアイデアのために、この問題を解決したいと思います:

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、実行できる事前定義された一連の操作もあります。したがって、クラス のオブジェクト操作の処理関数が必要です。これで、クラスが異なり、操作のセットが異なり、所有者が同じオブジェクトができました。で定義された操作のみを実行でき、 で定義された操作のみを実行できます。C1enumownC1obj2C2ownobjC1obj2C2

きちんと書かれるように処理関数を一般化する方法は? 列挙型を使用する必要がありますか?

4

4 に答える 4

0

そのために列挙型を使用することをお勧めします。これにより、ID の処理は不要になります。

public class Test {
  enum Operation {
    FOO, BAR, THESE, ARE, ALL, DIFFERENT, OPERATIONS
  }

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

    for (Operation op:ops)
      handleOperation(op);
  }

  public static void handleOperation(Operation op) {
    switch(op) {
    case FOO:
      System.out.println("FOO");
      break;
    case BAR:
      System.out.println("BAR");
      break;
    case THESE:
      System.out.println("THESE");
      break;
    case ARE:
      System.out.println("ARE");
      break;
    case ALL:
      System.out.println("ALL");
      break;
    case DIFFERENT:
      System.out.println("DIFFERENT");
      break;
    case OPERATIONS:
      System.out.println("OPERATIONS");
      break;
    default:
      System.out.println("PROBLEM");
    }
  }
}
于 2012-09-03T13:49:20.653 に答える
0

または単に if-elseif ケースを使用します。

private final static int ONE = 1;
private final static int TWO = 2;

public static void main(String[] args) {
int value = 1;

  if(value==ONE){

  }
  else if(value==TWO){

  }

}

于 2014-10-16T10:08:29.583 に答える