【发布时间】:2018-05-02 10:49:29
【问题描述】:
我目前正在编写一段代码,其中根据请求对象是否属于某个子类型来做出行为决策,如下所示:
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”对我来说似乎是脏代码,但布尔值似乎也不太正确。仍然欢迎任何建议。
【问题讨论】:
-
行为差异应该在
Reqeuest类的重写方法中,而不是使用instanceof。 -
instanceof通常是代码异味。布尔值也没有解决问题并增加了耦合。我不知道您的其余逻辑,但考虑在基类中实现一个方法,以便子类可以根据它们的类型完成工作。而且你不应该担心性能,这是过早的优化。 -
感谢您的回答,问题是差异不在于请求,而在于使用请求的方法。或者您是否建议覆盖“isSpecial ()”并让它在基本请求中返回 false。
标签: java performance oop instanceof