迭代创建对象 - 更好的方法

时间:2011-10-09 18:53:41

标签: java object construct

在我开发某些东西时,我想知道在迭代某些东西时创建一堆对象可能是更好/更快的方法。

让我们说我们有这个包装类:

public class Photo{
    private String url;
    private String creator;

    public Photo(String url, String creator){
        this.url = url;
        this.creator = creator;
    }
    // Getter methods down here...
}

我们有JSONArray张照片,我们只需要url - 和creator - 字符串:

JSONArray photos = json.getJSONArray("photos");
Photo[] photo_arr = new Photo[photos.length()];
// Iterate:
for (int i = 0; i < photos.length(); i++){
    // Create the objects here.
}

现在,我看到了三种可能的解决方案:

创建临时变量

创建一些临时变量,从当前对象获取所需的值,然后构造新的Photo - 对象:

// Iterate:
String url = "";
String creator = "";
for (int i = 0; i < photos.length(); i++){
    url = photos[i].getString("url");
    creator = photos[i].getString("creator");
    photo_arr[i] = new Photo(url, creator);
}

直接在构造函数

中使用返回值

不要创建临时变量,而是使用构造函数调用中getString() - 方法返回的值:

// Iterate:
for (int i = 0; i < photos.length(); i++){
    photo_arr[i] = new Photo(
        photos[i].getString("url"),
        photos[i].getString("creator")
    );
}

使用setter-methods

为包装类添加urlcreator的无参数构造函数和setter方法,并使用它们填充对象:

// Iterate:
for (int i = 0; i < photos.length(); i++){
    photo_arr[i] = new Photo();
    photo_arr[i].setUrl( photos[i].getString("url") );
    photo_arr[i].setCreator( photos[i].getString("creator") );
}

哪一个是更好/更快/更清洁的方法?

2 个答案:

答案 0 :(得分:3)

两种第一种方法是相似的。如果您认为变量更具可读性和可维护性,请引入变量。最后一个使Photo类可变,而在前两个方法中它是不可变的(尽管并不是在并发中使用的最严格的含义)。

在可能的情况下,您应该始终支持不变性,主要是因为它使程序更加健壮:在前两种情况下,Photo始终处于可用的完全构造状态。不在第三个。

请注意,性能在这里是无关紧要的:这三种方式肯定会导致可比较的时间,并且不是那种会使程序变慢的代码。不要过早优化。这是万恶之源。

答案 1 :(得分:2)

您为此处所查看的代码提供的解决方案之间的速度差异可以忽略不计。可读性实际上比人们想象的更重要。对您而言,最终用户的速度提升1%对您来说更重要吗?或者您将来可以在将来的版本中维护此代码?答案通常是后者。

出于这个原因,我会选择创建临时变量使用setter-methods (在我看来)可读性较差,但可能较慢,因为您必须输入每个setter方法并分配这些资源。 直接在构造函数中使用返回值(在我看来,再次)可读性较差,因此在这种情况下应避免使用;但如果返回的对象的大小较大,那么分配资源以将其存储在临时值中实际上可能是不可忽视的。