次の条件を満たすことができる場合:
- コード生成時にすべてのキーを知っています。
- コード生成時のすべての値(メソッド)を知っています。
次のようなコードを使用できます。
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
)。