簡體   English   中英

Java 等效於 C# Delegates(將要執行的各種類的方法排隊)

[英]Java equivalent of C# Delegates (queues methods of various classes to be executed)

域名注冊地址:

是否有 Java 等價於 C# 的委托,它允許我將各種類的方法排隊並將它們動態添加到隊列中? 語言構造而不是它的代碼。

背景:

我以前使用過 Unity 3D,我喜歡腳本的Update方法之類的東西。 只需聲明該方法即可將其添加到每幀執行的方法列表中。 我想在我的 LWJGL 游戲中創建類似的東西。 為此,我想使用委托(或類似的東西)。 是否有任何 Java 語言結構可以讓我這樣做? 我更喜歡包含兩個或更多(以便我可以挑選最適合我的代碼的)結構和使用它們的方法的答案。 我不想要代碼,我只想知道從哪里開始。 編程中最有趣的部分是解決問題,我不想被剝奪。 此外,我不想被確切地告知如何去做。 我想被引導到正確的方向,而不是被朝那個方向扔到那個目的地。 我將如何學習? :-)

實際上,Java 中的委托沒有確切的對應物。 但是有一些結構可以模仿它們的行為。

爪哇 8

功能接口

與 Java 8 中的委托相近的概念是函數式接口的概念

例如,如果您有一個 C# 委托:

delegate void Runnable();

在 Java 中,您將創建一個功能接口,如:

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

函數式接口的好處是它們可以很容易地在lambda 表達式中使用

示例

因此,讓我們假設您有以下課程:

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

    public void someMethod() {
    }
}

Lambda 表達式和方法引用

使用 Java 8,您可以獲得 lambda 表達式。

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

如果您實際上只是調用一個方法,則有一個簡短的命名方法引用

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

爪哇 7

在 Java 7 中,您唯一可以使用的是匿名類

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

我希望這不是太多的信息,所以你仍然可以學習。 ;-) 但是,我喜歡我的回答對查找此問題的其他人也有用。

摘自https://msdn.microsoft.com/en-gb/library/aa288459(v=vs.71).aspx

C# 中的委托類似於 C 或 C++ 中的函數指針。 使用委托允許程序員在委托對象中封裝對方法的引用。 然后可以將委托對象傳遞給可以調用引用方法的代碼,而不必在編譯時知道將調用哪個方法。 與 C 或 C++ 中的函數指針不同,委托是面向對象的、類型安全的和安全的。

也就是說,Java 沒有像 C# 那樣的委托。 但是,從 Java 8 開始,我們確實通過使用方法引用和函數接口來獲得某種函數指針。

正如您禮貌地要求的那樣,我不會確切地告訴您如何實現此代碼,但是您應該能夠根據這些信息提出解決方案。

java 函數接口 != c# 委托。 從消費者的角度來看,除了純 c 風格的函數指針之外,您將無法獲得任何詳細信息。 您無法判斷 java 函數接口是否將某些對象綁定為 lambda 表達式或成員函數,或者只是具有零依賴關系的靜態方法。 我想說 c# 委托提供了一些非常有趣的功能,可能不是那么重要,以幫助診斷潛在的程序缺陷,例如委托的線程安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM