Sun的Java gurunaths(nathaनाथ= sanskrit for deity-master-protector)应该屈服于接受代表的必要性并将其草拟为Java规范。
在C#中,我可以将一个方法作为委托引用的处理程序传递,而不需要因为我需要在Java中传递一个方法来创建一个类。
是什么原因导致它不必要(除了引用笨拙地使用一个全新的类用于此目的)或不利于Sun决定不用Java?创建类或匿名实现接口有哪些优势超过代理?我什么都想不到,你呢?
答案 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早)
答案 6 :(得分:0)
可能因为如果要在对象之间传递和共享方法,它不应该由一个单独的类拥有。它可能应该通过自己的类共享。我的意思是,如果你想到它,一个瞬态函数确实感觉有点奇怪。我想是坏OO。
我真的很喜欢UI工作的代表。它使窗口动作更容易编程。
它可能归结为你认为更负面的东西,一个拥有错误所有者的函数,或者(在我的情况下,无论如何)你的代码具有属于一个类的方法(按钮点击,窗口调整大小事件)不属于那一节课。
不确定我更喜欢哪个。
答案 7 :(得分:0)
无论它值多少,我都使用反射在Java中实现了回调/委托支持。详细信息和工作来源为available on my website。
答案 8 :(得分:-2)
C#中的代表看起来很难看。 (将某些内容声明为变量,然后在OOP中感觉不好后添加()
)
此外,如果你想:“然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。
您只需使用java.lang.reflect.Method
编辑:正如你所说,使用反射不是一个好方法。这是事实,但在我看来,在OOP视角中使用代表并不是更好的方法。它是一种功能语言结构。