java - Java:使用函数式与 OOP 范式
问题描述
我有一个特定的行为,我想在课堂上抽象出来。
我看到两种方法可以做到这一点。
选项 1:行为可以被“SomeClass”的常规子类化覆盖。
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
}
}
“选项 2”中不需要子类化。
问题:(编辑)
- 随着 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); }
}
推荐阅读
- android - 如何添加调试签名证书并从命令 propmt 获取 (SHA-1)
- r - R - 按日期分组并计算每天不同的值出现次数
- ios - 应用安装后删除钥匙串数据
- iphone - Iphone Simulator 未显示在开发人员菜单中
- apache-spark - 如何决定何时使用 spark sql 缓存或持久化?
- angular - 将菜单组件放置在表格的列内
- java - 来自 HttpURLConnection OkHttp3 的连接泄漏警告
- objective-c - 使用 Xcode 9.4.1 构建时 Mac 应用程序崩溃,使用 Xcode 8.3.3 构建时运行良好
- ruby-on-rails - 如何使用 wicked_pdf 在 ruby on rails 中使用的 erb 模板渲染 excel 表?
- bittorrent - bittorrent 片选策略