解释这个对象和类的不同表示

时间:2013-06-30 09:43:34

标签: java

在这里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的方法

3 个答案:

答案 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不是myClassmyClass看起来像变量或字段。你不 遵守惯例,但这样做有助于人们阅读你的代码。

答案 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