Java:使用函数式与 OOP 范式
Java : Using Functional Vs OOP Paradigms
我有一个特定的行为,我想在我的 class 中抽象出来。
我看到有两种方法可以做到这一点。
选项 1:该行为可以被 'SomeClass'.
的常规子class覆盖
Class SomeCalss{
public Output behaviour(Input){
//overriden behaviour
}
}
Class SomeOtherClass extends SomeCalss{
public Output behaviour(Input){
//overriden behaviour
}
}
选项 2:可以通过从外部插入功能定义来指定行为
Class SomeCalss{
public Output behaviour(Function<Input,Output> function, Input){
//Functional paradigm
}
}
在 'Option 2' 中不需要 Subclassing。
问题:(编辑)
- 随着 java 从 java8+ 开始完全支持这些函数式编程范例,抽象行为的传统过程是否发生了任何转变。什么是抽象出我的行为的更好方法,为什么?以防万一,视具体情况而定,在什么情况下应该使用 1 而不是另一个?
虽然选项 2 为您提供了灵活性,但它会强制客户端代码指定 Function 参数,您可能希望避免这种情况。
您的目标是为客户端提供一个简单的界面(行为(输入))并尽可能隐藏所有内容 - 以便客户端独立于您的代码。
选项 3 是
interface Behaves { public Output behaviour(Input i); }
class Behaviour1 implements Behaves {
public Output behaviour(Input i){ /* your implementation here*/ }
}
class FunctionBasedBehaviour implements Behaves {
private final Function<Input,Output> f;
public FunctionBasedBehaviour (Function<Input,Output> f) {this.f=f;}
public Output behaviour(Input i){ return f(i); }
}
我有一个特定的行为,我想在我的 class 中抽象出来。
我看到有两种方法可以做到这一点。
选项 1:该行为可以被 'SomeClass'.
的常规子class覆盖Class SomeCalss{
public Output behaviour(Input){
//overriden behaviour
}
}
Class SomeOtherClass extends SomeCalss{
public Output behaviour(Input){
//overriden behaviour
}
}
选项 2:可以通过从外部插入功能定义来指定行为
Class SomeCalss{
public Output behaviour(Function<Input,Output> function, Input){
//Functional paradigm
}
}
在 'Option 2' 中不需要 Subclassing。
问题:(编辑)
- 随着 java 从 java8+ 开始完全支持这些函数式编程范例,抽象行为的传统过程是否发生了任何转变。什么是抽象出我的行为的更好方法,为什么?以防万一,视具体情况而定,在什么情况下应该使用 1 而不是另一个?
虽然选项 2 为您提供了灵活性,但它会强制客户端代码指定 Function 参数,您可能希望避免这种情况。
您的目标是为客户端提供一个简单的界面(行为(输入))并尽可能隐藏所有内容 - 以便客户端独立于您的代码。
选项 3 是
interface Behaves { public Output behaviour(Input i); }
class Behaviour1 implements Behaves {
public Output behaviour(Input i){ /* your implementation here*/ }
}
class FunctionBasedBehaviour implements Behaves {
private final Function<Input,Output> f;
public FunctionBasedBehaviour (Function<Input,Output> f) {this.f=f;}
public Output behaviour(Input i){ return f(i); }
}