为什么Java没有方法委托?

时间:2009-12-29 08:40:58

标签: c# java delegates

Sun的Java gurunaths(nathaनाथ= sanskrit for deity-master-protector)应该屈服于接受代表的必要性并将其草拟为Java规范。

在C#中,我可以将一个方法作为委托引用的处理程序传递,而不需要因为我需要在Java中传递一个方法来创建一个类。

是什么原因导致它不必要(除了引用笨拙地使用一个全新的类用于此目的)或不利于Sun决定不用Java?创建类或匿名实现接口有哪些优势超过代理?我什么都想不到,你呢?

9 个答案:

答案 0 :(得分:15)

[次要编辑]

首先我要说的是,我不反对或赞成向Java添加委托。我只是在解释背景。

首先,Sun的Java团队在传统上比语言的演变更保守(与C#团队相比)。

其次,将委托构造添加到Java中可能需要引入新的关键字,例如:“delegate”。这将破坏现有代码,其中存在名为“delegate”的变量。

第三,这种设计原则被称为“单一选择原则”http://en.wikipedia.org/wiki/Single_choice_principle。当应用于语言设计时,它意味着程序员应该只有一种明显的方法来实现某些东西。或者,换句话说,多种选择是有风险的。将代理引入Java将违背这一原则,因为他们的行为可以通过匿名类来实现。

[当然,这个原则不应该从字面上理解。如果是那时我们将使用一台好的旧图灵机进行编程。我想太阳队员认为代表们不会构成超过单一选择违规的好处]

答案 1 :(得分:15)

以下是Tom Ball's account,用于将Microsoft添加到Java的Microsoft提案以及Sun拒绝它们的原因。

IMO,Java应该在十二年前关闭。 Gilad Bracha argued关闭,没有人听。用他自己的话说:

  

我个人认为自1997/98年以来增加了关闭。我的血液       当我回想起我得到的反应时,压力仍然可以显着上升       当时:“我们的客户不是要求它,所以为什么要添加它?”。

伤心,但确实如此。

答案 2 :(得分:6)

简单。

通过不将委托的概念引入Java,他们使语言更简单。就像没有属性,索引器......一样。

(顺便说一下,使用更简单的语言并不一定更简单;可能他们应该添加代表,但这不是他们做出设计决策的方式)

答案 3 :(得分:4)

java没有闭包,因为它不是一种功能语言,而是一种面向对象的语言 在许多情况下,你可以伪造另一种语言范例,在这种情况下使用匿名接口而不是闭包 但是现在事情正在发生变化,并且在scala,groovy,jruby等新的jvm语言的压力下,结合了oo和funcional范式,java委员会试图将闭包放入java 7。

答案 4 :(得分:2)

在Java中,您有inner classes,它们与父类的一个特定实例相关联,并且可以直接访问其成员。因此,实现内部类不需要(编写)方法(代码)。(/ p>)

C#没有内部类。 内部类(如在Java中)和委托(如在C#中)都有它们的优点(有时我会错过C#中的内部类),但是从语言设计者的角度来看坚持其中任何一个(而不是支持两者)是有道理的,因为这使得类库设计更加一致。

答案 5 :(得分:1)

因为,他们认为:

  

绑定方法引用[delegates]根本就没有必要。 [...]此外,它们有损Java语言的简单性和统一性。绑定方法引用不是未来语言演变的正确途径。

取自这篇(旧)白皮书:

http://java.sun.com/docs/white/delegates.html

现在Java正在考虑添加它们,一旦语言进化得足够多。我很确定他们很快就会使用这种语言(至少比Perl 6:P早)

您还可以使用:Software Monkey Callback method

答案 6 :(得分:0)

可能因为如果要在对象之间传递和共享方法,它不应该由一个单独的类拥有。它可能应该通过自己的类共享。我的意思是,如果你想到它,一个瞬态函数确实感觉有点奇怪。我想是坏OO。

我真的很喜欢UI工作的代表。它使窗口动作更容易编程。

它可能归结为你认为更负面的东西,一个拥有错误所有者的函数,或者(在我的情况下,无论如何)你的代码具有属于一个类的方法(按钮点击,窗口调整大小事件)不属于那一节课。

不确定我更喜欢哪个。

答案 7 :(得分:0)

无论它值多少,我都使用反射在Java中实现了回调/委托支持。详细信息和工作来源为available on my website

答案 8 :(得分:-2)

C#中的代表看起来很难看。 (将某些内容声明为变量,然后在OOP中感觉不好后添加()

此外,如果你想:“然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。

您只需使用java.lang.reflect.Method

即可

编辑:正如你所说,使用反射不是一个好方法。这是事实,但在我看来,在OOP视角中使用代表并不是更好的方法。它是一种功能语言结构。