java - Java - 行为决策“instanceof”与标志
问题描述
我目前正在编写一段代码,其中根据请求对象是否属于某个子类型来做出行为决策,如下所示:
class Request{
public void doThing(){
System.out.println("doing Thing...");
}
}
class SpecialRequest extends Request{
...
}
void method(Request request){
if(request instanceof SpecialRequest){
System.out.println("is special...");
}
request.doThing();
}
在这种情况下,SpecialRequest 没有其他任何实现,这将其与普通请求区分开来。我现在的问题是,使用这种风格是否有任何优点或缺点:
class Request{
...
public boolean isSpecial(){
return special;
}
public void doThing(){
System.out.println("doing Thing...");
}
}
void method(Request request){
if(request.isSpecial()){
System.out.println("is special...");
}
request.doThing();
}
我了解第二种方法如何变得非常复杂,我想做的决定越多。但我也对这两种方法如何比较性能感兴趣。
提前致谢。
编辑:首先感谢您的快速回复。我可能应该提到,我的 Request 和我的 SpecialRequest 应该只是携带数据,而不包含任何逻辑。这就是整个软件的设计方式。我的方法只是消耗了请求,并且应该根据请求是否特殊而表现不同。“instanceof”对我来说似乎是脏代码,但布尔值似乎也不太正确。仍然欢迎任何建议。
解决方案
使用方法的明显优势是它与特定类型没有紧密联系。您可以添加一个VerySpecialRequest
也提供此行为的新类,并且您不一定需要扩展SpecialRequest
才能做到这一点。
然而,这里更紧迫的问题是你有明确的条件分支。该对象应该负责确定是否需要任何额外的行为,然后讨厌的条件逻辑就完全消失了:
class Request{
public void doThing(){
System.out.println("doing Thing...");
}
}
class SpecialRequest extends Request{
@Override
public void doThing(){
super.doThing();
System.out.println("is special...");
}
}
推荐阅读
- python-3.x - 熊猫排序未正确排序数据
- arrays - ColdFusion:如何检查数组元素是否存在?
- r - R中的函数蒙特卡罗模拟错误
- azure - 在 Azure 中使用 ARM 模板在基于 Linux 容器的函数应用上启用持续部署
- java - UTF-8 JAXB 编组后 XML 内容仍为 ISO 8859-1
- openshift - OKD(OpenShift Origin)可以安装在 RHEL 8 上吗?
- sql - Excel 文件、案例陈述或替代方案的 MS SQL Excel
- mapi - 如何从 RDOAddressList 实例访问 AddressListType?
- c# - 分块上传文件 - .Net 核心
- git - 我分支了一个未合并的功能分支,但该未合并的分支现在已合并