Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单一方法类与接口实现_Java - Fatal编程技术网

Java 单一方法类与接口实现

Java 单一方法类与接口实现,java,Java,想象一下下面的界面: public interface ActivationFunction { double calculate(double value); } 使用两种类似的实现: 基于类: public class SignFunction implements ActivationFunction { @Override public double calculate(double value) { return value >= 0.0

想象一下下面的界面:

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() {
};
基于接口:

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() {
};
哪一个更可取?为什么?


感谢您的意见

这两种方法都很好,因此在某种程度上,这只是个人喜好的问题,以及如何在您的应用程序中使用。在类似的情况下,我会选择一种机制并使用它,直到一种方法比另一种更合适

如果您现在想尝试做出“正确”的决定,那么接口机制的主要优点(无论如何,我认为)是它允许类的行为由多个接口组成。您可以有一个类,该类从多个接口获取函数的实现,而这不能通过普通的旧类继承来实现

另一个优点是它强制函数是无状态的,这使得调试它们和理解它们更容易。也不太可能有人不必要地将状态引入到您的函数中

正如本文的另一个答案所说明的,缺点是并非所有开发人员都意识到可以在接口中实现,因此可能会受到其他开发人员的一些回击


您还需要在某处实例化一个对象,以便能够调用接口上的方法

都不是。
@functioninterface
的全部目的是验证它是否可以用作lambda:
final SignFunction SignFunction=(value)value>=0.0?1.0 : -1.0;@SeanPatrickFloyd可能还有其他实现:StepFunction、SigmoidFunction&etc@AlexSaunin那么?如果所有这些类都只是实现calculate的函数,为什么不将SignFunction设为实现ActivationFunction接口的静态类,因为似乎不需要创建对象?仍然没有得到使用lambda与显式子类之间的关系。