0

在这里,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

4

3 回答 3

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
    }
}

请注意,我已更改VectorList. 您永远不会显示如何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,例如MyClassnot myClassmyClass看起来像一个变量或字段。您不必遵循约定,但这样做有助于人们阅读您的代码。

于 2013-06-30T09:47:33.380 回答
2

第一个获取存储在locn向量中索引 i 处的餐厅。

第二个调用该distanceToLocations()方法,获取该方法的结果,并setDistance()以该结果作为参数调用餐厅。

如果代码尊重 Java 命名约定、使用正确的变量名称、不使用 Vector(超过 10 年不应再使用)并使用泛型集合List<Restaurant>(原始类型Vector

于 2013-06-30T09:49:42.790 回答
0

这是老式代码,这是一个“现代化”版本:

private void distances()    
{    
    if (this.locations != null) {    
        for (final Restaurant restaurant : this.locations) {
            restaurant.setDistance(distanceToLocations(restaurant));
        }
    }
}

这更明确 -我认为。该方法迭代locations(如果不是null),并且对于其中的每个RestaurantsetDistance()在餐厅使用distanceToLocations方法。

于 2013-06-30T09:51:05.533 回答