代码之家  ›  专栏  ›  技术社区  ›  Blessed Geek

为什么不使用.NET风格的委托而不是Java中的闭包呢?

  •  18
  • Blessed Geek  · 技术社区  · 14 年前

    好吧,这将是我第三次击败一匹垂死的马。

    然而,这个问题与我前面两个关于闭包/委托的问题不同,我的前两个问题是关于委托的计划以及闭包的预计规格和实现是什么。

    这个问题是关于-为什么Java社区在定义3种不同类型的闭包时,我们可以简单地从我们亲爱的友好邻居微软那里窃取委托锁、股票和桶的概念。

    我很想得出两个非技术性的结论:

    1. Java社区应该保持自豪感,以需要进行复杂的工作为代价,不屈服于借用任何微软的概念,或者以其他方式维护微软的辉煌。
    2. 代表是微软的专利技术。

    问题1。在.NET风格的委托中是否存在三种(或更多)闭包形式需要解决的弱点或不足?

    问题2。我是在Java和C之间转换时问这个问题的,这让我很好奇,C委托正是我所需要的。是否有一些在闭包中实现的特性目前在C委托中不可用?如果是这样的话,那是什么原因,因为我看不到比代表们充分提供给我的东西更需要的东西?

    问题3。我知道在java中实现闭包/委托的一个问题是减少语言的正交性,在这种情况下,执行特定任务的方法不止一种。为了确保java保持它的正交性,为了避免委托而花费的时间和级别的卷积值得吗?在关系设计中,我们知道,通过经常充分满足第二范式来打破正交性是可取的。为什么java不能为了简单起见而减少正交性和OO性?

    2 回复  |  直到 14 年前
        1
  •  36
  •   Dónal    10 年前

    你的问题很讽刺。您想知道为什么Java社区在添加闭包的三种不同的建议上举步维艰,而您建议的解决方案是在混合中添加第四个选项?

    但回答你的问题:

    • 讨论的正确论坛是openjdk项目lambda的邮件列表。这不是一个建议可能会影响这项努力的地方。

    • Java的发展必须保持向后兼容,但是添加delegate关键字将是一个突破性的变化。

    • C有三种类型的委托表达式:带有delegate关键字的旧表达式、lambdas with=>{语句和lambdas表达式。如果C语言团队要重做一次,我们肯定不会有这么多表单。Java为什么要采用C的历史包袱?

    • 因为C泛型在原语上操作,所以Func<和Action< gt;委托类型可以用作穷人的结构函数类型。但是在Java中,泛型被删除,只在引用类型上工作,并且类型不能通过它们的arity来区分。因此,Java必须有大量明确命名的“标准”函数类型才能获得相同的效果。那可不太好。

        2
  •  2
  •   Fakrudeen    14 年前

    除代表外,C#还有闭包。在我看来他们是不一样的。

    委托=函数指针。

    closure={function,environment}。 定义[匿名]函数并将其与环境打包的方法。严格地说,后者只应称为闭包,前者是“lambda表达式”。