dav*_*ooh 13 java programming-languages java-8
我看看Java 8新闻与7相比,除了lambdas或新时间框架之类的非常有趣的东西,我发现引入了一个新功能(?):默认方法.
我在本文中找到了以下示例:
public interface Math {
int add(int a, int b);
default int multiply(int a, int b) {
return a * b;
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.上面的代码看起来像一个abstract带有实现方法的类.那么,为什么要在接口中引入默认方法呢?这种方法的实际优势是什么?
在同一篇文章中,我读到了这个解释:
为什么要在接口中添加方法?我们之所以这是因为接口与它们的实现类太紧密耦合了.即,在不破坏实现者类的情况下,无法在接口中添加方法.在接口中添加方法后,其实现的所有类必须声明此新方法的方法体.
嗯,这根本不能说服我.恕我直言我相信,当一个类实现一个接口时,必须为其中的每个方法声明方法体.这肯定是一个约束,但它也证实了它的"本质"(如果你明白我的意思......)
如果你对每个继承类都有共同的逻辑,那么你将把它放到一个实现abstract类中.
那么,默认方法的真正优势是什么?(看起来更像是一种解决方法,而不是新功能...)
更新 我理解这种方法是为了向后兼容,但它仍然不能让我这么说服.接口表示类必须具有的行为.所以实现某个接口的类肯定会有这种行为.但是,如果有人可以随意更改界面,则此约束会被破坏.行为可以随时改变......我错了吗?
Tim*_*m B 12
这是为了向后兼容.
如果您有其他人已实现的接口,那么如果向接口添加新方法,则所有现有实现都将被破坏.
通过使用默认实现添加新方法,您可以与现有实现保持源代码兼容.
对于一个稍微简单/做作的例子,希望能够证明这一点让我们说你创建了一个库:
void drawSomething(Thing thing) {
}
interface Thing {
Color getColor();
Image getBackgroundImage();
}
Run Code Online (Sandbox Code Playgroud)
现在你来做一个新版本的库,你想添加边框颜色的概念,这很容易添加到界面:
interface Thing {
Color getColor();
Color getBorderColor();
Image getBackgroundImage();
}
Run Code Online (Sandbox Code Playgroud)
但问题是每个使用你的库的人都必须回过头来做过的每一个Skin实现并添加这个新方法.
相反,如果您提供了一个默认实现,getBorderColor那么只需调用getColor一切"只是工作".
过去有很多方法在抽象接口上起作用.Java的8之前,他们不得不投入额外的类配对的接口,例如Collections带Collection.
这种旧方法既不比default方法更有说服力,也不实用.而不是list.sort()你不得不说Collections.sort(list).这也意味着您在创建时必须做出基本决定interface,要么您需要每个List实现来实现sort方法,要么sort在实用程序类中提供无法覆盖的方法.
使用default方法,您可以同时拥有一个标准实现,List实现不需要单独实现,但如果具体实现有更有效的方法来了解它的内部结构,例如ArrayList.sort将其内部数组直接传递给Arrays.sort跳过,则仍然可以覆盖它们一些中间操作.
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |