1. ホーム

[解決済み】Java パラメータとしてメソッドを渡す

2022-04-16 06:48:41

質問

メソッドを参照渡しする方法を探しています。Javaがメソッドをパラメータとして渡さないことは理解していますが、私は代替手段を得たいと思います。

パラメータとしてメソッドを渡す代わりにインターフェイスがあると聞きましたが、インターフェイスがどのように参照によってメソッドとして機能するのか理解できません。もし私が正しく理解していれば、インターフェースは定義されていない抽象的なメソッドの集合に過ぎません。複数の異なるメソッドが同じパラメータで同じメソッドを呼び出す可能性があるため、毎回定義する必要があるようなインターフェースを送信したくありません。

私が実現したいのは、このようなことです。

public void setAllComponents(Component[] myComponentArray, Method myMethod) {
    for (Component leaf : myComponentArray) {
        if (leaf instanceof Container) { //recursive call if Container
            Container node = (Container) leaf;
            setAllComponents(node.getComponents(), myMethod);
        } //end if node
        myMethod(leaf);
    } //end looping through components
}

などが呼び出される。

setAllComponents(this.getComponents(), changeColor());
setAllComponents(this.getComponents(), changeSize());

解決方法は?

編集 : Java 8時点のものです。 ラムダ式 として、良い解決策になります。 その他 回答 が指摘しています。下記の回答は、Java7以前のバージョンで書かれたものです...


を見てみましょう。 コマンドパターン .

// NOTE: code not tested, but I believe this is valid java...
public class CommandExample 
{
    public interface Command 
    {
        public void execute(Object data);
    }

    public class PrintCommand implements Command 
    {
        public void execute(Object data) 
        {
            System.out.println(data.toString());
        }    
    }

    public static void callCommand(Command command, Object data) 
    {
        command.execute(data);
    }

    public static void main(String... args) 
    {
        callCommand(new PrintCommand(), "hello world");
    }
}

編集する として ピート・カーカム氏が指摘する を使って行う方法もあります。 訪問者 . ビジターアプローチはもう少し複雑で、ノードはすべて acceptVisitor() しかし、より複雑なオブジェクトグラフをトラバースする必要がある場合は、検討する価値があります。