Java中扩展方法的实际用途是什么?

时间:2013-06-22 23:24:56

标签: c# java extension-methods

我理解C#扩展方法,因为它们允许您向已经关闭的类定义添加新方法。 Java防御者/扩展方法似乎完全不同。例如:

public interface Interfacable {
    public void regular();
    public default void defender() { System.out.println("I am protected"); };
}

好吧,所以我知道你可以用Java扩展方法做'trait-y'的事情,但我不明白为什么它被称为同一个东西(一个“扩展”),如果它似乎呃,不是一样。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

添加这些内容的原因是为Java添加闭包的一部分,因此可以轻松升级到集合类之类的东西。添加闭包的挑战是,现在有很多功能要添加到标准集合中。但是,如果将这些添加到现有接口,则会破坏这些接口的任何实现。解决此问题的方法是使用新方法添加其他接口。这可以在没有虚拟扩展方法的情况下实现,但是它有其自身的缺点。也就是说,需要在使用之前添加新接口的实现。由于今天可能有很多实现,因此升级所有这些实现可能需要很长时间。但是,与此同时,您要添加的方法与实现非常不相关。它们应该基本上做同样的事情,至少在基本情况下。构建它的团队决定处理该案例的方式是启用可以覆盖的默认行为的规范。通过添加接口的方式,功能就在那里,由图书馆作者决定他们想要编写不同的实现。关键是他们没有,或者有一个止损功能,直到他们这样做。

很长一段时间它们基本上就像特征一样,你是正确的它们与C#中的扩展方法不同。从我所读到的,最初的实现是更多的C#。但是,由于样式的限制(即无法覆盖功能)以及缺乏使用反射而决定以这种方式使用它们会发现它们。尽管实施方法发生了变化,但似乎名称仍然存在。

有关详细信息,请参阅解释虚拟扩展方法的write-up