在这里myClass
我无法理解盯着的线条。任何人都可以解释它们是如何工作的。
class myClass {
private Vector locations;
private void distances() {
Vector locn= locations;
if (locn!= null) {
for (int i = 0; i < locn.size(); i++) {
** Restaurant a = (Restaurant) locn.elementAt(i);
** a.setDistance(distanceToLocations(a));
}
}
}
private String distanceToLocations(Restaurant restaurant) {
// returns string
}
}
此处 Restaurant
是一个, setDistance()
是类Restaurant
的方法
答案 0 :(得分:2)
elementAt
Vector
方法被定义为返回Object
,但显然locations
包含Restaurant
条目。因此,要访问Restaurant
方法,您必须投射从Object
返回Restaurant
的引用。这就是(Restaurant)
(Restaurant)locn.elementAt(i);
部分正在做的事情。
这是相当老式的代码。现代方法是使用Vector<Restaurant>
(如果不需要同步,可能List<Restaurant>
)和增强的for
循环:
class myClass
{
private List<Restaurant> locations;
private void distances()
{
List<Restaurant> locn = locations; // You don't really need to do this bit
if (locn!= null) {
for (Restaurant a : locn) {
a.setDistance(distanceToLocations(a));
}
}
}
private String distanceToLocations(Restaurant restaurant) {
// returns string
}
}
注意我已将Vector
更改为List
。您从未显示locations
的初始化方式,但使用List<Restaurant>
您可以执行以下操作:
this.locations = new ArrayList<Restaurant>();
// or
this.locations = new LinkedList<Restaurant>();
我猜你真的不需要同步。但是,如果您这样做,java.util
中的选项比Vector
更好,例如使用Collections.synchronizedList
获取同步列表,或使用java.util.concurrent
中的某些内容。并且您需要在循环期间进行同步。例如:
this.locations = Collections.synchronizedList(new ArrayList<Restaurant>());
然后
synchronized (locn) {
for (Restaurant a : locn) {
a.setDistance(distanceToLocations(a));
}
}
附注:Java代码中压倒性的约定是让类名以大写字符开头并使用CamelCase,例如: MyClass
不是myClass
。 myClass
看起来像变量或字段。你不 遵守惯例,但这样做有助于人们阅读你的代码。
答案 1 :(得分:2)
第一个将餐厅存储在locn
向量中的索引i处。
第二个调用distanceToLocations()
方法,获取此方法的结果,并使用此结果作为参数调用餐馆的setDistance()
。
如果代码遵循Java命名约定,使用正确的变量名称,不使用Vector(不应再使用10年以上),并使用泛型集合,代码将更容易理解和类型安全(List<Restaurant>
)而不是原始类型(Vector
),它强制您使用强制转换来告诉编译器:存储在向量中的对象实际上是一个餐馆。
答案 2 :(得分:0)
这是旧式代码,这是一个“现代化”版本:
private void distances()
{
if (this.locations != null) {
for (final Restaurant restaurant : this.locations) {
restaurant.setDistance(distanceToLocations(restaurant));
}
}
}
这更明确 - 我认为。该方法使用locations
方法在餐厅上对null
(如果不是Restaurant
)及其中的每个setDistance()
进行迭代,distanceToLocations
。