我正在编写一个使用UnfoldingMaps库(http://unfoldingmaps.org/javadoc/index.html?overview-summary.html)的作业。
该赋值有一个名为CommonMarker的类。该类继承自类SimplePointMarker,该类继承自类AbstractMarker。AbstractMarker实现了接口标记器。
我对调用isInside方法的方法isInside中发生的转换感到困惑。
下面是我们必须完成的框架代码。的目标是为第一个标记设置实例变量lastSelected,它发现mouseX和mouseY位于。我们将使用在isInside抽象类中定义的UnfoldingMap (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;
}
}我不知道为什么在调用方法isInside之前标记会被“下线”。这是最佳做法吗?请分享您的想法,我对Java非常陌生,我已经尝试尽可能多地跟踪代码,但它对我来说还是相当难以抗拒的。
发布于 2017-07-05 09:11:39
有一个不同之处:您的版本将抛出一个ClassCastException,而m (为m.isInside(map, mouseX, mouseY)提供true )也是,而不是CommonMarker的一个实例。
而第二个解决方案将抛出该异常,以防该列表中的任何标记都不是CommonMarker (准确地说,在某些m之前的任何对象对if条件都是正确的)。
从这个意义上讲,行为上存在着微妙的差异。如果这在您的环境中很重要,则取决于您的环境。我的直觉是:如果这种差异在你的环境中很重要--那么我会把这看作是一种设计的味道,我会进一步研究这一背景。
除此之外,我认为这两种选择都是“可以的”。但理想情况下,您应该使事情更加明确,例如:
if (m instanceOf CommonMarker) {
... cast
} else {
... throw exception with meaningful error message当然,第二个版本的性能影响最小,因为每个循环迭代都执行强制转换;而不是只执行一次。但是,对于性能而言,实例/强制转换都是无关紧要的。
话虽如此:许多人认为自己是一种设计的味道。所以,再次-我会后退一步,如果有其他的选择,以避免完全沮丧。
https://stackoverflow.com/questions/44921718
复制相似问题