在哪里放置一个向下广播(在超类中调用方法之前)?

时间:2017-07-05 09:07:57

标签: java inheritance interface

我正在处理使用 UnfoldingMaps 库(http://unfoldingmaps.org/javadoc/index.html?overview-summary.html)的作业。

该作业有一个名为 CommonMarker 的类。此类继承自继承自 AbstractMarker 类的类 SimplePointMarker AbstractMarker 实现接口 Marker

我对在调用 isInside 方法的方法 selectMarkerIfHover 中发生的转换感到困惑。

以下是我们必须完成的框架代码。目标是为它发现mouseX和mouseY在其中的第一个Marker设置实例变量 lastSelected 。我们将使用AbstractMarker抽象类中定义的 isInside(UnfoldingMap m,float x,float y)方法来检查位置是否在标记内。

lastSelected定义为:

private CommonMarker lastSelected;

给出的骨架代码是:

private void selectMarkerIfHover(List<Marker> markers)
    {
        // TODO: Implement this method
    }

我的解决方案如下所示,我在将m分配给lastSelected之前进行了向下转换。

for(Marker m:markers)
        {
            if(m.isInside(map, mouseX, mouseY))
            {
                m.setSelected(true);
                lastSelected = (CommonMarker)m;
                return;
            }
        }

指导员给出的解决方案与我的甚至在调用inInside之前完成向下转换的方法略有不同。

for (Marker m : markers) 
        {
            CommonMarker marker = (CommonMarker)m;
            if (marker.isInside(map,  mouseX, mouseY)) 
            {
                marker.setSelected(true);                   
                lastSelected = marker;
                return;
            }
        }

我不确定为什么标记会被降低&#39;在调用方法之前是isInside。这是最佳做法吗?请分享您的想法,我是Java的新手,我尽可能多地追踪代码,但对我来说仍然非常压倒性。

1 个答案:

答案 0 :(得分:3)

正好有一个区别:你的版本会抛出一个ClassCastException,而m true m.isInside(map, mouseX, mouseY)的{​​{1}}也是而不是 {的实例{1}}。

而第二个解决方案会抛出该异常,以防该List中的任何标记不是CommonMarker(确切地说:任何对象 previous 对某些CommonMarker赋予if条件的真实性。

从这个意义上讲,行为存在细微差别。如果您的环境中的问题取决于您的背景。我的直觉是:如果这种差异在您的环境中很重要 - 那么我会将其视为一种设计气味,我会进一步研究这种背景。

除此之外:我认为两个选项都是“ok”。但理想情况下,你会让事情变得更加明确,例如:

m

当然:第二个版本的性能命中率最低,因为每个循环迭代都会执行强制转换;而不只是一次。但是,instanceof / cast在性能上都是微不足道的。

话虽如此:许多人认为 downcasts 本身就是一种设计气味。所以,再次 - 我会退后一步,想一想是否还有其他选择可以完全避免向下倾斜。