想象一下以下界面:
public interface ActivationFunction {
double calculate(double value);
}
有两个类似的实现:
基于类:
public class SignFunction implements ActivationFunction {
@Override
public double calculate(double value) {
return value >= 0.0 ? 1.0 : -1.0;
}
}
...
final SignFunction signFunction = new SignFunction();
基于界面:
public interface SignFunction extends ActivationFunction {
@Override
default double calculate(double value) {
return value >= 0.0 ? 1.0 : -1.0;
}
}
...
final SignFunction signFunction = new SignFunction() {
};
哪个更好,为什么?
感谢您的意见
答案 0 :(得分:1)
两者都很好,所以在某种程度上它只是个人偏好的问题以及它将如何在你的应用程序中使用。在类似的情况下,我会选择其中一种机制并使用它,直到很明显一种方法比另一种方法更合适。
如果你想尝试做出“正确”的决定,那么接口机制的主要优点(在我看来无论如何)是允许类的行为由多个接口组成。你可以有一个从多个接口实现函数实现的类,你不能通过普通的旧类继承来实现。
另一个优点是它强制函数无状态,这使得调试它们并更容易理解它们。也不太可能有人不必要地将状态引入你的函数。
正如本文的另一个答案所示,缺点是并非所有开发人员都意识到您可以在界面中实现,因此您可能会从其他开发人员那里获得一些回击。
您还需要在某处实例化一个对象,以便能够在接口上调用该方法。