为什么我们需要Java中的默认方法?

davioooh:

我正在查看与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类中。

那么,默认方法的真正优势是什么?(它看起来比新功能更像是一种解决方法...)


更新我知道这种方法是为了向后兼容,但是仍然不能说服我太多。接口表示类必须具有的行为因此,实现特定接口的类肯定具有这种行为。但是,如果有人可以随意更改接口,则此约束将被打破。行为随时可能改变...我错了吗?

B队:

这是为了向后兼容。

如果您具有其他人已经实现的接口,那么如果您向该接口添加新方法,则所有现有实现都将被破坏。

通过使用默认实现添加新方法,您将与现有实现保持源兼容。

对于一个稍微简单/人为设计的示例,希望可以证明这一点,让我们说您创建了一个库:

void drawSomething(Thing thing) {
}

interface Thing {
    Color getColor();
    Image getBackgroundImage();
}

现在,您要制作一个库的新版本,并且要添加边框颜色的概念,可以很容易地将其添加到界面中:

interface Thing {
    Color getColor();
    Color getBorderColor();
    Image getBackgroundImage();
}

但是问题是,使用您的库的每个人都必须回顾他们曾经做过的每个Skin实施并添加此新方法。

相反,如果您为getBorderColor刚刚提供的默认实现提供了默认实现getColor那么一切都“正常”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章