-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だけが必要な写真があります。urlcreator

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

今、私は3つの可能な解決策を見ます:

一時変数の作成

現在のオブジェクトから目的の値を取得し、新しいオブジェクトを作成する一時変数を作成します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()に、コンストラクター呼び出しの-methodからの戻り値を使用します。

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

セッターメソッドの使用

およびのパラメーターなしのコンストラクターとsetter-methodsをラッパークラスに追加し、urlそれらcreatorを使用してオブジェクトにデータを入力します。

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

最初の 2 つの方法は似ています。より読みやすく保守しやすいと思われる場合は、変数を導入してください。Photo最初の 2 つのメソッドではクラスが不変であったのに対し、最後のメソッドはクラスを可変にします (ただし、同時実行で使用される最も厳密な意味ではありません)。

主にプログラムをより堅牢にするため、可能な場合は常に不変性を優先する必要がPhotoあります。最初の 2 つのケースでは、 a は常に使用可能な完全に構築された状態にあります。3番目のものではありません。

ここではパフォーマンスは関係ないことに注意してください: 3 つの方法は確かに同等の時間につながります。また、プログラムを遅くするようなコードではありません。時期尚早に最適化しないでください。諸悪の根源です。

于 2011-10-09T19:00:24.810 に答える
2

ここで見ているコードに対して提供したソリューション間の速度の違いはごくわずかです。読みやすさは、実際には、人が考えるよりも重要です。エンドユーザーが 1% の速度向上を経験することは、あなたにとってより重要ですか? または、将来のバージョンでこのコードを維持できるようになりますか? 答えは通常後者です。

そのため、一時変数の作成を使用します。 セッター メソッドを使用すると (私の意見では) 読みにくくなりますが、各セッター メソッドを入力してリソースを割り当てる必要があるため、遅くなる可能性があります。 戻り値をコンストラクターで直接使用することは (やはり、私の意見では) 読みにくいため、このような場合は避ける必要があります。しかし、返されたオブジェクトがより大きなサイズであった場合、それを一時的な値に格納するためにリソースを割り当てることは、実際には無視できない可能性があります。

于 2011-10-09T19:04:59.610 に答える