0

タイトルはおそらく最高ではありません、私はそれをお詫び申し上げます。

データベース値のデフォルトを定義するために使用している最終的な静的リストがいくつかあります。デフォルトの値のリストは決して変更されるべきではありません。そのため、値を設定するときは、Collections.nCopies(int、T)を使用して不変のリストを取得します。これらのリストは、別のクラスのリストにデフォルトを設定するために使用されます。これらのリストの値は変更されると予想されます。

デフォルトのクラスの擬似コード:

public final class FooDefaults {
    public final static List<Integer> LIST_ONE;
    public final static List<String> LIST_TWO;
    //This map allows easier access to "column" values.
    public final static List<Map<String,String>> LIST_THREE;

    static {
        LIST_ONE = Collections.nCopies(7, 5);
        LIST_TWO = Collections.nCopies(10, "boo");
        Map<String, String> temp = new java.util.LinkedHashMap<>();
        for(int i=0;i<15;i++) {
            temp.put(("Param"+i),"foo");
        }
        LIST_THREE = Collections.nCopies(10, temp);
    }
}

編集可能な値のクラスの擬似コード:

public class Foo {
    //Keep the reference from changing.
    //Prevents an accidental new.
    private final List<Integer> listOne;
    private final List<String> listTwo;
    private final List<Map<String,String>> listThree;

    public Foo() {
        listOne = new java.util.ArrayList<>(FooDefaults.listOne);
        listTwo = new java.util.ArrayList<>(FooDefaults.listTwo);
        listThree = new java.util.ArrayList<>(FooDefaults.listThree);
    }
}

私の懸念は、これらのリストで浅いコピーを実行したため、Fooのリストの変更がFooDefaultsのリストに表示されることです。

この投稿:https : //stackoverflow.com/a/1685158/1391956は、文字列と整数が不変であるため、FooDefaults.LIST_ONEとFooDefaults.LIST_TWOの値を誤って上書きすることを心配する必要がないことを示唆しています。

したがって、私の主な関心事は、FooDefaults.LIST_THREEのマップに含まれる値です。FooのlistThreeのマップの値を変更した場合、変更はFooDefaultsに表示されますか?

もしそうなら、これを処理するための最も効率的な方法は何でしょうか?クラスFooは、1000回以上インスタンス化され、別のクラスのリストに追加される可能性が高いため、速度が問題になる可能性があります。

速度を上げるために、最初はFooDefaultsで最終的な静的リストを作成しました。これは、FooDefaultsでリストを作成してデータをコピーする方が、Fooがインスタンス化されるたびに作成するよりも高速であるという私の(おそらく間違った)仮定です。

編集:ディープコピーを実行する必要がある場合は、次のようなものを使用する予定です。

public static final List<Map<String, String>> getListThreeCopy() {
    Map<String,String> temp = new java.util.LinkedHashMap<>();
    for(Map.Entry<String, String> entry: LIST_THREE.get(0).entrySet()) {
        temp.put(entry.getKey(),entry.getValue());
    }

    List<Map<String,String>> rtnList = new java.util.ArrayList<>();
    for(int i=0;i<LIST_THREE.size();i++) {
        rtnList.add(temp);
    }
    return rtnList;
}

より速い方法はありますか?

4

1 に答える 1

0

最後に、投稿の最後に記載されているコードをループで使用して、ディープコピーを1,500回実行し、時間を計測しました。インスタンス化コードでも同じことをしました。

少し予想したように、リストを最初から再作成する方が、ディープコピーよりもはるかに高速です。

ディープコピーの場合は16ミリ秒、インスタンス化の場合は0ミリ秒。System.currentTimeMillis()を使用してタイミングを調整しました。

静的関数でのみ作成する限り、エラーについて心配する理由はほとんどありません。

于 2012-10-25T23:23:02.993 に答える