我正在处理使用 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的新手,我尽可能多地追踪代码,但对我来说仍然非常压倒性。
答案 0 :(得分:3)
正好有一个区别:你的版本会抛出一个ClassCastException,而m
true
m.isInside(map, mouseX, mouseY)
的{{1}}也是而不是 {的实例{1}}。
而第二个解决方案会抛出该异常,以防该List中的任何标记不是CommonMarker
(确切地说:任何对象 previous 对某些CommonMarker
赋予if条件的真实性。
从这个意义上讲,行为存在细微差别。如果您的环境中的问题取决于您的背景。我的直觉是:如果这种差异在您的环境中很重要 - 那么我会将其视为一种设计气味,我会进一步研究这种背景。
除此之外:我认为两个选项都是“ok”。但理想情况下,你会让事情变得更加明确,例如:
m
当然:第二个版本的性能命中率最低,因为每个循环迭代都会执行强制转换;而不只是一次。但是,instanceof / cast在性能上都是微不足道的。
话虽如此:许多人认为 downcasts 本身就是一种设计气味。所以,再次 - 我会退后一步,想一想是否还有其他选择可以完全避免向下倾斜。