为什么Java没有方法委托?

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

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

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

以下是Tom Ball对微软提议将它们添加到Java以及Sun拒绝它们的原因。

IMO,Java应该在十二年前关闭。 吉拉德·布拉查(Gilad Bracha)主张关闭,没有人听。 用他自己的话说:

我个人主张自1997/98年以来增加封闭。 当我回想起当时的反应时,我的血压仍然明显上升:“我们的客户不是要求它,所以为什么要添加它?”。

伤心,但也是如此。

[次要编辑]

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

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

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

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

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

简单。

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

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

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

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

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

因为,他们认为:

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

摘自这篇(旧)白皮书:

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

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

您还可以使用: Software Monkey Callback方法

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

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

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

不确定我更喜欢哪个。

无论它有什么价值,我都使用reflection在Java中实现了回调/委托支持。 我的网站上提供了详细信息和工作源。

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

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

你可以简单地使用java.lang.reflect.Method

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