我正在查看与8相比的Java 8新闻,除了像lambdas或新的时间框架之类的非常有趣的东西之外,我还发现引入了一个新功能(?):default methods。
我在本文中找到了以下示例:
public interface Math {
int add(int a, int b);
default int multiply(int a, int b) {
return a * b;
}
}
对我来说似乎很奇怪。上面的代码看起来像是abstract
带有已实现方法的类。那么,为什么要在接口中引入默认方法呢?这种方法的实际优势是什么?
在同一篇文章中,我阅读了以下解释:
为什么要在接口中添加方法?我们之所以这样,是因为接口与其实现类紧密结合在一起。即在不破坏实现者类的情况下不可能在接口中添加方法。在接口中添加方法后,所有实现的类都必须声明此新方法的方法主体。
好吧,这根本无法说服我。恕我直言,我认为当类实现接口时,必须为其中的每个方法声明方法主体。这当然是一个约束,但也证实了它的“性质”(如果您理解我的意思……)
如果每个继承类都具有通用逻辑,则将其放入实现abstract
类中。
那么,默认方法的真正优势是什么?(它看起来比新功能更像是一种解决方法...)
更新我知道这种方法是为了向后兼容,但是仍然不能说服我太多。接口表示类必须具有的行为。因此,实现特定接口的类肯定具有这种行为。但是,如果有人可以随意更改接口,则此约束将被打破。行为随时可能改变...我错了吗?
这是为了向后兼容。
如果您具有其他人已经实现的接口,那么如果您向该接口添加新方法,则所有现有实现都将被破坏。
通过使用默认实现添加新方法,您将与现有实现保持源兼容。
对于一个稍微简单/人为设计的示例,希望可以证明这一点,让我们说您创建了一个库:
void drawSomething(Thing thing) {
}
interface Thing {
Color getColor();
Image getBackgroundImage();
}
现在,您要制作一个库的新版本,并且要添加边框颜色的概念,可以很容易地将其添加到界面中:
interface Thing {
Color getColor();
Color getBorderColor();
Image getBackgroundImage();
}
但是问题是,使用您的库的每个人都必须回顾他们曾经做过的每个Skin实施并添加此新方法。
相反,如果您为getBorderColor
刚刚提供的默认实现提供了默认实现,getColor
那么一切都“正常”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句