2012-10-29 59 views
8

C#的扩展方法非常适合添加语法糖。 Java扩展方法非常适合允许库开发人员向其接口添加方法。Java有没有办法让非库开发人员使用扩展方法?

我是一个非库Java开发人员,知道我会从库中获取新功能中获得很多好处,但我仍然希望拥有C#扩展方法的语法糖能力。

这是,还是将在未来版本的Java中可能?

如:我想方法添加到String类...

String data = StringUtils.capitalize("abcd"); // instead of this 
String data = "abcd".capitalize() // I would like to do this 

请不要集中在这个特殊的例子,我只显示类的功能,我希望能够以实现。

+0

Java没有一种以这种方式扩展类的“​​凡人”机制。使用某些调试工具可以使用一些技巧,但它们不适用于调试场景以外的用途。 –

+1

请注意,通常“库开发人员”和“应用程序开发人员”(至少在Java世界)之间没有硬性界限。如果给定的功能可用于库,那么它也可用于应用程序。当然,一些功能的复杂性使它更有可能在图书馆中使用。例如:*编写*在复杂场景中充分利用泛型的API非常困难,因此通常只能在(可重用的)库中完成。 *使用*这样的API更容易(如果API是精心设计的)。 –

回答

5

Java没有此功能,它也不可能很快有它。

Groovy但是确实有very similar feature,它也在JVM上运行。也许这是一个选择。

+0

谢谢肖恩。几年前我尝试了Groovy(Java 7之前),并发现它太慢了。我能够通过减少代码来加快速度,但速度仍然慢了10倍。所以我只是切换回Java。我应该再次尝试使用Java 7来查看是否遇到同样的问题,但我认为我已经读过Groovy仍然比Java慢10倍,而且我无法承受10倍的硬件! –

+0

@BobThule:Groovy这一天获得了很多快,有趣的是,Java 7在这方面发挥了很大的作用(通过invokedynamic')。 –

2

我怀疑你正在考虑计划添加到Java 8中,它允许你添加默认实现的方法到接口 - 这样你就可以添加新的方法而不会破坏所有现有的代码。如果您控制接口类型,这仅适用于您 - 因此它不适用于String,因为String不是接口。

+0

Hi Louis,对,但C#的扩展方法允许向类中添加方法 - 它只是语法糖,但它使得代码更加漂亮,并且由于代码完成可以为您提供更快的开发方法。我相信JDK开发人员首先将Java扩展方法模型化为C#,但后来发现它并不能解决库开发人员面临的问题,并将其转化为现在的东西 - 这是一个非常棒的解决方案,但对于试图让代码更漂亮的最终开发人员来说并不是特别有用 –

+0

呃。我个人非常赞成Java人员对Java 8扩展方法的限制 - 作为一个库设计者,我对于终端开发人员能够将任意方法添加到某个类型非常感慨。 –

+0

我认为java 8扩展方法非常好,我不会失去它们的功能。这是一个偏好的事情,如果你喜欢在静态类中隐藏很多静态方法的话,我不会说你错了,但我更喜欢直接在我的对象上调用方法。我认为它更干净,更具可读性,并且看起来更加面向对象。在大多数其他语言都可以使用mixins/traits/extension方法的情况下,我希望能够对Java做同样的事情。怎么了String没有更丰富的成员方法?特别是因为它是最后一堂课? –

相关问题