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

3

我理解C#扩展方法,它们允许您向已封闭的类定义中添加新方法。Java的defender/extension方法似乎是完全不同的东西。例如:

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

好的,我知道你可以使用Java扩展方法来执行“特性”操作,但是如果它似乎没有做同样的事情,为什么它被称为相同的东西(扩展)呢?有人可以帮助我吗?


那个无法编译。有面向方面编程(AOP)听起来像是你想要的,但不是那个。 - SJuan76
你应该使用Java-8吗? - sircodesalot
1
不是,Java 7是最后一个发布的版本。如果你想讨论Java 8,你应该在问题中指明。 - SJuan76
2
真正的程序员不会等待官方发布 : ) 。但说真的,Java-8仍然是Java,显然Java-7没有扩展方法。 - sircodesalot
这两个特性非常不同,各有其优点。目前我们仍然不知道Java的“默认方法”可以用于什么范围。C#的扩展方法显然也非常有用。希望最终Java也会复制C#的特性,而C#也会复制Java的。 - ZhongYu
1个回答

5
这些方法被添加的原因是为了向Java中添加闭包,以便可以轻松升级到诸如集合类之类的东西。添加闭包的挑战在于现在有很多想要添加到标准集合中的函数,但是,如果将它们添加到现有接口中,会破坏那些接口的任何实现。解决这个问题的一种方法是添加一个带有新方法的附加接口。虚拟扩展方法不是必需的,但它也有自己的缺点,即需要先添加新接口的实现才能使用它。由于今天可能有很多实现,所以获取所有这些实现的升级可能需要很长时间。但是,与此同时,您想要添加的方法的方式基本上与实现无关。至少在基本情况下,它们应该执行相同的操作。构建此功能的团队决定的处理方式是启用可覆盖的默认行为规范。这样,随着接口的添加,该功能就存在了,库编写者可以决定是否编写不同的实现,关键是他们不必这样做,或者在他们这样做之前有临时功能。

总之,它们基本上像特质一样,你说得对,它们与C#中的扩展方法不同。据我所读,最初的实现更像C#。但是,由于其风格的限制(即无法覆盖功能)和不能使用反射进行发现的缺点,决定以这种方式使用它们。似乎这个名字已经固定下来了,即使实现方法也发生了变化。

有关完整详细信息,请参见撰写的说明虚拟扩展方法。


2
我认为现在它简单地被称为“默认方法”。 - ZhongYu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接