簡體   English   中英

為什么不使用.NET樣式的委托而不是Java中的閉包?

[英]Why not .NET-style delegates rather than closures in Java?

好的,這將是我第三次擊敗一匹垂死的馬。

但是,這個問題與我之前的兩個關於閉包/代表的問題不同,后者詢問代表的計划以及閉包的預計規范和實現是什么。

這個問題是關於 - 當我們可以簡單地從我們心愛的友好鄰居 - 微軟竊取委托鎖,股票和桶的整個概念時,為什么Java社區在努力定義3種不同類型的閉包。

有兩個非技術性的結論我很想進入:

  1. Java社區應該保持自己的驕傲,代價是需要付出艱辛的努力,不要屈服於借用任何微軟的概念或以其他方式證明微軟的輝煌。
  2. 代表是微軟的專利技術。

好的,除了以上兩種可能性,

Q1。 .NET風格的代理中是否存在三種(或更多種)封閉形式會解決的弱點或不足之處?

Q2。 我在Java和C#之間轉換時問這個問題,它讓我感到興奮的是C#代理完全符合我的需要。 是否有可在C#代理中當前不可用的閉包中實現的功能? 如果是這樣,他們是什么因為我看不到我需要什么比C#代表給我足夠的東西?

Q3。 我知道在java中實現閉包/委托的一個問題是減少語言的正交性,其中不止一種方式暴露於執行特定任務。 為了確保java保持其正交性水平,是否值得花費卷積和花費時間來避免代表? 在關系設計中,我們知道通過經常充分滿足第二范式而破壞正交性是可取的。 為簡單起見,為什么java不能減少正交性和OO-ness?

Q4。 JVM的體系結構在技術上受限於實現.NET樣式的委托。 如果這個原因(強調不可能的虛擬)是真的,那么為什么三個閉包提議不能隱藏在簡單的委托關鍵字或注釋之后:如果我們不喜歡使用@delegate,我們可以使用@method。 我看不出委托語句格式如何比三個閉包提案更復雜。

你的問題具有諷刺意味。 您想知道為什么Java社區正在努力解決添加閉包的三個不同提議,您建議的解決方案是添加第四個選項?

但要回答你的問題:

  • 討論的正確論壇是openjdk項目lambda的郵件列表。 這不是建議可能影響該努力的地方。

  • C#和Java的類型系統有很大不同,因此C#解決方案不會直接應用。 例如,C#具有聲明站點方差(in / out),而java具有use-site variance(通配符)。 在C#中指定的lambda參數類型的推斷不適用於Java。

  • Java的發展必須保持向后兼容,但添加delegate關鍵字將是一個重大變化。

  • C#有三種類型的委托表達式:舊的委托表達式使用委托關鍵字,語句lambdas使用=> {,表達式為lambdas。 如果C#語言團隊讓它重新做,我們肯定沒有這么多形式。 Java為什么要采用C#的歷史包袱?

  • 因為C#泛型操作基元,所以Func <>和Action <>委托類型可以用作窮人的結構函數類型。 但是在Java中,泛型被擦除,僅在引用類型上工作,並且類型不能通過它們的arity來區分。 因此,Java必須擁有大量明顯命名的“標准”函數類型才能獲得相同的效果。 那不太好看。

總的來說,C#解決方案不適應Java中非常自然的解決方案。

除代表外,C#還有閉包。 在我看來,他們並不相同。

delegate =函數指針。

closure = {function,environment}。 定義[匿名]功能並將其與環境打包在一起的方法。 嚴格來說,后者應該只稱為閉包,前者是'lambda表達'。

暫無
暫無

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

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