3

静的メソッドを含む(または静的メソッドへの参照を含む)配列を作成したいと思います。メソッドとのインターフェースを実装するクラスの配列を作成しようとしました。このメソッドでは、オブジェクトを取得してから、そのオブジェクトのメソッドを呼び出します。これは静的メソッドでは機能しません。Javaでそれを行う方法はありますか?

編集:これは私がこれまでに使用した方法です:

interface TableElement{
    public Integer lookup(int value);
}

TableElement[] table = new TableElement[]
{
    new TableElement() { public Integer lookup(int value) { return 0; } },
    new TableElement() { public Integer lookup(int value) { return value * 3; } },
    new TableElement() { public Integer lookup(int value) { return value * value + 3; } },
};

public Integer find(int i, int value) {
    return table[i].lookup(value);
}

findメソッドを静的にしたいと思います。

4

2 に答える 2

3

もちろん、の配列をMethod作成してから、invokeを使用して呼び出すことができます。次の例を確認してください。リフレクション(Java)を使用してプライベート静的メソッドを呼び出すにはどうすればよいですか?

于 2013-02-01T19:00:17.263 に答える
0

次の条件を満たすことができる場合:

  1. コード生成時にすべてのキーを知っています。
  2. コード生成時のすべての値(メソッド)を知っています。

次のようなコードを使用できます。

public class Table {
    public static int hash(String key) {
        /* you can use any type of key and whatever hash function is
         * appropriate; this just meant as a simple example.
         */
        return key.length();
    }

    public static Integer find(String s, int value) {
        int h = hash(s);

        switch (h) {
          case 4: // "zero"
            if (s.equals("zero"))
                return methodZero(value);

          case 6: // "triple"
            if (s.equals("triple"))
                return methodTriple(value);

          case 11: // "squarePlus3"
            if (s.equals("squarePlus3"))
                return methodSquarePlus3(value);

          default:
            throw new UnsupportedOperationException(s);
        }
    }

    private static Integer methodZero(int value) { return 0; };
    private static Integer methodTriple(int value) { return value * 3; };
    private static Integer methodSquarePlus3(int value) { return value * value + 3; };

    /**
     * Just a demo.
     */
    public static void main(String arguments[]) {
        System.out.println("Zero(5): " + find("zero", 5));
        System.out.println("Triple(5): " + find("triple", 5));
        System.out.println("SquarePlus3(5): " + find("squarePlus3", 5));
        System.out.println("boom!");
        find("missingcode", 5);
    }
}

いずれかの要件を緩和する必要がある場合は、すべてを静的に実行できるとは思いません。

新しいキーを追加できるようにする場合は、追加時に通常のハッシュテーブルを作成して保存する必要があります。(コードで確認できdefaultます。)

値を置き換えられるようにする場合は、おそらくMethodオブジェクトまたはの実装を使用して、そこで間接参照のレベルを使用する必要がありますCallable(メソッドの本体内からこれらを呼び出すことができますmethodZero)。

于 2013-02-01T23:41:28.560 に答える