0

私のメソッド呼び出しが次の場合:

obj.getLevelOne().getLevelTwo().getValue();

そして、このメソッドを以下のパラメータとして渡したい:

boolean checkValue( obj, method , value) 
{
   return obj.method() == value;
}

次のようにcheckValueメソッドを呼び出したい:

checkValue(obj, "getLevelOne().getLevelTwo().getValue", value);

これを達成する方法はありますか?助けてください。

4

2 に答える 2

3

Java では、関数はファースト クラスの概念ではありません (まだ、Java 8 で導入されています)。そのため、関数型の概念を持つ他の多くの言語のようにメソッドを渡すことはできません。

代わりに、インターフェイスを宣言し、匿名の内部クラスを使用して実装する必要があります。例えば

インターフェイス

interface MyGetter {
    Object doGet();
}

チェック方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}

呼び出し

checkValue(new MyGetter() {
    public Object doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5);

呼び出しで実際に行っていることは、新しいクラスとその型のオブジェクトを作成して、必要な実際の呼び出しを行うことです。

編集:

異なる戻り値の型が必要な場合は、インターフェイスを作成してメソッドをジェネリックにすることができます。

インターフェイス

interface MyGetter<T> {
    T doGet();
}

チェック方法

<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}

呼び出し

checkValue(new MyGetter<SomeClass>() {
    public SomeClass doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5); 
于 2012-09-14T10:29:27.423 に答える
1

本当にこのようなことをしたい場合は、次のいずれかをお勧めします。

1. Callable を使用して、匿名のサブクラスを作成します。注: これは、Callable を使用することを除いて、上記の "MyGetter" でのアプローチと多少似ています。jdk に組み込まれているこの目的のために意図されたものを使用できるため、独自のインターフェイスは必要ありません。

public <T> boolean checkValue(Callable<T> valueGetter, T value) {
    return value.equals(valueGetter.call());
}

final MyObject obj = new MyObject();
checkValue(new Callable<String>() { 
     public String call() { return obj.getLevelOne().getLevelTwo().getValue(); }
}, "foo");

2.ある種のELパッケージを使用します(mvelは組み込みライブラリとしてうまく機能します)。

次に、「levelOne.levelTwo.value」を式として実行し、mvel を使用して「obj」で評価します。

public <T> boolean checkValue(Object obj, String expression, T value) {
    Object objVal = MVEL.eval(expression, obj);
    return value.equals(objVal);
}
checkValue(obj, "levelOne.levelTwo.value", "foo");

もちろん、最初のものははるかにタイプセーフですが、呼び出し可能な実装に明示的にコーディングしているため、「式」はコンパイル時に行われます。2 番目の方法はより動的で、実行時に式を計算できます。

于 2012-09-14T13:25:14.327 に答える