web-dev-qa-db-ja.com

Java C#のデリゲートに相当(実行するさまざまなクラスのメソッドをキューに入れる))

TLDR:

Java C#の同等物 delegates を使用して、さまざまなクラスのメソッドをキューに入れ、それらを動的にキューに追加できるようにしますか?コードの代わりに言語構成体それ。

環境:

以前にUnity 3Dを使用したことがあり、スクリプトのUpdateメソッドのようなものが好きです。メソッドを宣言するだけで、各フレームで実行されるメソッドのリストに追加されます。 LWJGLゲームでそのようなものを作成したいと考えています。このために、デリゲート(またはそれに相当するもの)を使用したいと思います。 Java言語構成体はありますか?私は2つ以上を含む回答を好みます(コードを選択するのに最適で、コードに最適です)コンストラクトとその使用方法。コードが必要ないので、どこから始めればよいかを知りたいだけです。プログラミングの最も楽しい部分は、問題を解決することであり、それを奪われたくありません。また、方法を正確に教えられたくありません。目的地に向けて投げられるのではなく、正しい方向に案内されたいのです。

9
James Yeoman

https://msdn.Microsoft.com/en-gb/library/aa288459(v = vs.71).aspx から抽出:

C#のデリゲートは、CまたはC++の関数ポインターに似ています。デリゲートを使用すると、プログラマはデリゲートオブジェクト内のメソッドへの参照をカプセル化できます。次に、デリゲートオブジェクトを、参照されるメソッドを呼び出すことができるコードに渡すことができます。コンパイル時にどのメソッドが呼び出されるかを知る必要はありません。 CまたはC++の関数ポインターとは異なり、デリゲートはオブジェクト指向で、タイプセーフで、安全です。

つまり、JavaにはC#のようなデリゲートはありません。ただし、Java = 8、 メソッド参照と関数インターフェイス を使用して、ある種の関数ポインタを持っています。

丁寧なご要望にお応えして、このコードの実装方法を正確に説明することはしませんが、この情報を使用して解決策を考え出すことができるはずです。

実際、Javaのデリゲートに対応する正確なものはありません。しかし、それらの動作を模倣する構成要素があります。

Java 8

機能インターフェース

Java 8でデリゲートに近づく概念は、機能インターフェースの概念です)。

たとえば、C#デリゲートがある場合:

delegate void Runnable();

javaでは、次のような機能的なインターフェイスを作成します。

@FunctionalInterface
public interface Runnable {
    void run();
}

関数型インターフェースのいいところは、 ラムダ式 で簡単に使用できることです。

したがって、次のクラスがあるとします。

public class SomeClass {
    public static void someStaticMethod() {
    }

    public void someMethod() {
    }
}

ラムダ式とメソッド参照

Java 8を使用すると、ラムダ式を取得できます。

List<Runnable> queue = new ArrayList<>();
queue.add(() -> someMethod());
queue.add(() -> someStaticMethod());

実際にメソッドを呼び出すだけの場合、メソッド参照という短縮形があります。

List<Runnable> queue = new ArrayList<>();
queue.add(this::someMethod);
queue.add(SomeClass::someStaticMethod);

Java 7

Java 7の場合、使用できるのは 匿名クラス だけです。

List<Runnable> queue = new ArrayList<>();
queue.add(new Runnable() {
    public void run() {
        someMethod();
    }
});
queue.add(new Runnable() {
    public void run() {
        someStaticMethod();
    }
});

これがあまり多くの情報ではなかったといいので、あなたはまだ学ぶことができます。 ;-)しかし、私は私の質問がこの質問を探している他の人々にも役立つことを望みます。

Java関数インターフェイス!= c#デリゲート。消費者の側からは、純粋なCスタイルの関数ポインター以外の詳細情報を取得することはできません。 Java関数インターフェイスがいくつかのオブジェクトをラムダ式またはメンバー関数としてバインドしているのか、依存関係のない静的メソッドだけをバインドしているのかはわかりません。c#デリゲートはいくつかの非常に興味深い機能を提供しますは、デリゲートのスレッドセーフなど、プログラムの潜在的な欠陥の診断に役立つため、それほど重要ではない場合があります。

0
Hzj_jie