Java的卓越大师们(gurunaths,natha नाथ = 梵文中的神灵-大师-保护者)应该降低身段接受委托的必要性,并将其纳入Java规范。
在C#中,我可以将方法作为处理程序传递,引用为委托,而无需因需要传递方法而创建类。但在Java中不行。
除了引用全新类以外的笨拙使用外,Sun决定不将委托引入Java的原因是什么?在匿名创建类或实现接口方面,与委托相比有哪些优势?我想不到任何优势,你呢?
Java的卓越大师们(gurunaths,natha नाथ = 梵文中的神灵-大师-保护者)应该降低身段接受委托的必要性,并将其纳入Java规范。
在C#中,我可以将方法作为处理程序传递,引用为委托,而无需因需要传递方法而创建类。但在Java中不行。
除了引用全新类以外的笨拙使用外,Sun决定不将委托引入Java的原因是什么?在匿名创建类或实现接口方面,与委托相比有哪些优势?我想不到任何优势,你呢?
首先,我并不反对或支持向Java中添加委托。我只是在解释背景。
其次,相较于C#团队,Sun的Java团队传统上更加保守,不太愿意让语言进化。
第三,将委托结构添加到Java中可能需要引入新的关键字,比如“delegate”。这将破坏现有代码中已经存在的名为“delegate”的变量。
第四,有一个设计原则叫做“单一选择原则”http://en.wikipedia.org/wiki/Single_choice_principle。当应用于语言设计时,意味着程序员只应有一种明显的方法来实现某个目标。换句话说,多种选择是有风险的。向Java中添加委托将违反这一原则,因为它们的行为可以通过匿名类来实现。
[当然,这个原则不应被字面理解。如果是这样的话,我们就要使用好老的图灵机来编程了。我想Sun的团队认为,委托并没有超过单一选择违规的好处]
Java没有引入委托的概念,这使得语言更加简单。就像没有属性、索引器等一样。
(顺便说一句,使用简单的语言不一定更简单;也许他们应该添加委托,但这并不是他们做出设计决策的方式)
Java没有闭包,因为它的设计初衷不是作为一种函数式语言,而是面向对象的语言。
在许多情况下,您可以模拟另一种语言范例,例如使用匿名接口代替闭包。
但现在情况正在发生变化,在新的JVM语言(如Scala、Groovy、JRuby等)的压力下,这些语言结合了面向对象和函数式范例,Java委员会正在尝试将闭包放入Java 7中。
因为他们认为:
绑定方法引用[委托]是完全不必要的。此外,它们会削弱Java语言的简洁性和统一性。绑定方法引用并不是未来语言发展的正确方向。
摘自这份(旧的)白皮书:
http://java.sun.com/docs/white/delegates.html
现在Java正在考虑添加它们,一旦语言发展到足够的程度。我相信它们很快就会成为语言的一部分(至少比Perl 6更快:P)
您还可以使用:软件猴回调方法
也许是因为如果一个方法要被传递和共享到多个对象中,它就不应该由单个类拥有。它可能应该通过自己的类进行共享。我的意思是,如果你考虑一下,一个短暂的函数确实感觉有点奇怪。我想这是不好的面向对象编程。
我真的很喜欢使用委托来处理UI工作。这使得窗口操作变得更加容易编程。
这可能取决于你认为哪个更负面,一个具有错误所有者的函数,还是(至少在我的情况下)你的代码具有属于一个类的方法(按钮点击、窗口调整大小事件),而这些方法并不属于那个类。
我不确定我更喜欢哪一个。
C#中的委托对我来说看起来很丑。(将某些东西声明为变量,然后在其后添加()
在面向对象编程中感觉不好)
此外,如果您想要:"委托对象可以传递给可以调用引用方法的代码,而无需在编译时知道将调用哪个方法。
您可以简单地使用java.lang.reflect.Method
编辑:正如您所说,使用反射不是一个好的方法。这是真的,但是在面向对象编程的角度来看,使用委托也不是更好的方法,我认为它是一种函数式语言结构。
::
。 - Cecil Has a Name