-1

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

假设我们有这个包装类:

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 方法

为包装类添加一个无参数的构造函数和设置方法,urlcreator使用它们来填充对象:

// 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") );
}

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

4

2 回答 2

3

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

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

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

于 2011-10-09T19:00:24.810 回答
2

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

For that reason, I'd go with Creating temporary variables. Using setter-methods is (in my opinion) less readable, but potentially slower since you will have to enter each of those setter methods and allocate those resources. Us[ing] the returned-values directly in the constructor is (again, in my opinion) less readable and should therefore be avoided in cases like this; but if the returned object was something of a larger size, then allocating the resources to store it in a temporary value may actually be non-negligible.

于 2011-10-09T19:04:59.610 回答