我使用instanceof“错误”吗?

时间:2014-06-20 04:53:11

标签: java oop instanceof

所以在我的一个简单的游戏引擎中,我使用了一个接口" UpdatedGameElement"通过update()方法的实现,每帧都必须更新具有该接口的对象。

现在在我的" main"(不是主要的)类中,我遍历GameElement列表并检查它们是否是UpdatedGameElement的实例。如果是这种情况我投了它们,然后调用.update()。

现在的问题是,我刚才读到使用instanceof通常是编码错误的标志;在我们同意的情况下,当类被用作标记时,可以很容易地用变量替换它们。但我对我的案子不太确定。

我想我可以让GameElement类实现UpdatedGameElement,并定义一个标准的空update()方法,需要重写以实际执行某些操作,但我不确定是否以及为什么这样做会比什么更好我现在有。

你会说什么?

编辑:我的主要课程中的一些代码:

public void process()
{
    if (active)
    {
        for (GameElement GE: elements)
        {
            if (!GE.isToBeRemoved())
            {
                //Relevant part
                if (GE instanceof UpdatedGameElement)
                {
                    ((UpdatedGameElement) GE).update();
                }           
            }
            else
            {
                prepareRemoval(GE);
            }
        }  
        processRemovals();
    }
}

3 个答案:

答案 0 :(得分:2)

如果OP发出邀请:

如果使用接口除了向GE添加标记和更新方法之外没有其他原因,并且除了在此单个instanceof之后不使用类型UGE,那么这是具有这些额外类型的弱理由。特别是当更新的能力可以扩展到所有其他GE时,它只是一个NOOP。

基类中的抽象方法强制程序员决定是否需要为特定子类编码更新。从“防御性设计”的角度来看,这种方法相当“安全”。但是,当然,你写了更多的代码。

与之前的技术相比:如果您忘记界面,则不会发出警报。

另外,如果你在基类中编写一个NOOP更新方法,并依赖程序员的快捷方式在必要时覆盖:方便,但是当你忘记这样做时会有风险。

总结:有一些微妙的专业人士和骗子 - 而不仅仅是“嗅觉”的实例。

答案 1 :(得分:0)

根据您的评论,您提到GameElement实现了UpdatedGameElement,现在GameElement是唯一一个实现UpdatedGameElement的类,但将来可能更多。此外,我希望您知道无法实例化接口,因此您无法创建UpdatedGameElement的实例,因此实际上是创建了接口的实现类的实例。因此,在运行时,当您创建GameElement的实例并将其分配给UpdatedGameElement变量时,这并不意味着该实例现在是UpdatedGameElement类型,它实际上是GameElement类型,现在假设您还有一个实现XYZElement的类实现UpdatedGameElement并创建如下实例:

UpdatedGameElement ge = new GameElement();
UpdatedGameElement xyze = new XYZElement();

你认为使用支票实例如下所述是好的,因为在任何一种情况下它都是真的,你永远不知道ge和xyze属于哪种实例。

if(ge instance of UpdatedGameElement)
instead one should always check for if(ge instance of GameElement)

Similarly for if(xyze instance of UpdatedGameElement)
instead one should always check for if(ge instance of XYZElement)

Hope this helps.

答案 2 :(得分:0)

  

我想我可以让GameElement类实现   UpdatedGameElement,并定义一个标准的空update()方法   需要被覆盖以实际做某事

是的,你一定要这样做!

原因:假设将来你需要实现另一个扩展UpdatedGameElement的“可更新”类 - 考虑你必须在每个地方做的代码更改使用了instanceof ...