18

重複の可能性:
パラメータとして Java Pass メソッド

Javaでメソッドをパラメータとして渡すことは可能ですか? コードを繰り返さなくても、以下のメソッドの最善の方法は何でしょうか。

public void enterUserInput(javax.swing.JTextField inputField, javax.swing.JTextField   outputField, method rangeChecking){

    String input;
    double output;
    input = inputField.getText();
    output = Double.parseDouble(input);
    if(rangeChecking(output)){
        outputField.setText(input);
        inputField.setText(null);
    }

別のクラスから rangeChecking メソッドを呼び出しますが、enterUserInput を呼び出すたびに rangeChecking メソッドが異なります

4

8 に答える 8

32

これを行うには、インターフェイスを使用する必要があります。

目的の関数を宣言するインターフェイスをメソッドに渡し、目的のメソッドを呼び出します。呼び出される特定のメソッドは、実装クラスによって実装されたものです。

これを戦略設計パターンと呼びます。

コードサンプル:

public static interface Foo { //this is the interface declaration
    public void print();
}
public static class Bar implements Foo { //Bar is an implementing class
    public void print() {
        System.out.println("Bar");
    } 

}
public static void test(Foo foo) { //the method accepts an interface
    foo.print(); //and invokes it, the implementing class' print() will be invoked.
}
public static void main(String... args) throws Exception {
    test(new Bar()); //invoke test() with the class implementing the interface
}
于 2012-09-27T08:11:29.380 に答える
8

そのメソッド シグネチャを使用してインターフェイスを作成し、その匿名サブクラスをメソッド実装で渡します。

// the interface that contains the method/methods you want to pass
interface MethodWrapper {
    public void method(String s); }

// ...
// in your code
// assuming that "observable" is an object with a method "setCallback" that 
// accepts the callback
// note that your method implementation will have access to your local variables

public void someMethodOfYours() {
    observable.setCallback(new MethodWrapper() {
        public void method(String s) {
            System.out.println(s);
        } }
    );
    // note that your anon subclass will have access to all your contain method 
    // locals and your containing class members, with [some restrictions][1]
}

// in the "observable" class - the class that receives the "callback method"
// ...

if( updated() ) {
    callback.method("updated!"); }

Java の将来のバージョン (ラムダの出現により) では、インターフェイスと匿名の内部クラスを定義する必要はありません。同等のバイトコードにコンパイルされる特定のラムダ構文があります。

[1]別のメソッドで定義された内部クラス内の非最終変数は参照できません

于 2012-09-27T08:13:00.907 に答える
6

私が知る限りではありません。これは通常、必要なメソッドを持つインターフェイスを作成し、そのインターフェイスを実装するクラスを渡すことによって行われます。

public interface IRangeCheck
{
    boolean check(double val);
}

public class RangeChecker implements IRangeCheck
{
    public boolean check(double val)
    {
        return val > 0.0;
    }
}

...
    public void blabla(..., IRangeCheck irc)
    {
        ...
        if(irc.check(output))
           ...
    }
于 2012-09-27T08:11:07.417 に答える
5

Java リフレクションを使用できます。

public void enterUserInput(javax.swing.JTextField inputField, javax.swing.JTextField   outputField, String methodName){

String input;
double output;
input = inputField.getText();
output = Double.parseDouble(input);
Method m = this.getClass().getDeclaredMethod(methodName, Double.class);

if((Boolean)m.invoke(this, output)){
    outputField.setText(input);
    inputField.setText(null);
}
于 2012-09-27T08:14:37.287 に答える
4

を使用してこれを行う方法はありますが、Reflection避けるのが最善です。やりたいことは、次のようなインターフェイスを作成することです。

    public interface RangeChecker {

    boolean rangeChecking(double input);


}

次に、各範囲チェック メソッドの実装を作成します。

    public class SomeRangeCheck implements RangeChecker {

    public boolean rangeChecking(double input) {
        // do something
    }

}

次に、他のメソッドの署名は次のようになります。

public void enterUserInput(JTextField inputField, JTextField   outputField, RangeChecker rangeChecking)

RangeChecker インターフェイスを実装する任意のオブジェクトを渡すことができること。

于 2012-09-27T08:22:50.447 に答える
2

必要なメソッドを定義するインターフェイスを作成し、そのインターフェイスを実装するクラスのオブジェクトを渡すことができます。多くの場合、匿名クラスがそのために使用されます。

interface Worker {
    public void callMe();
}

public function callWorker(Worker w) {
    w.callMe();
}

callWorker(new Worker() {
    public void callMe() {
        System.out.println("Hi there!");
    });
于 2012-09-27T08:13:42.140 に答える
1

いいえ、メソッドを引数として渡すことはできません。

最善の方法は、インターフェイスを作成し、それを実装するクラスを作成し (必要に応じて実装を変更します)、クラスのオブジェクトを引数として渡すことだと思います。

また、リフレクションを使用して、methodName を文字列としてメソッドに渡すこともできます。リフレクションを使用してそのメソッドを呼び出します。

お役に立てれば :-)

于 2012-09-27T08:15:28.417 に答える
1

Java でメソッドを渡すことはできません。

インターフェイスを宣言し、インターフェイスを実装するクラスをパラメーターとして取得することで、パラメーターを介して関数を呼び出すことができます。

コードで匿名クラスを作成できます。

于 2012-09-27T08:13:44.703 に答える