首页 > 解决方案 > 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”对我来说似乎是脏代码,但布尔值似乎也不太正确。仍然欢迎任何建议。

标签: javaperformanceoopinstanceof

解决方案


使用方法的明显优势是它与特定类型没有紧密联系。您可以添加一个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...");
    }
}

推荐阅读