タイトルはおそらく最高ではありません、私はそれをお詫び申し上げます。
データベース値のデフォルトを定義するために使用している最終的な静的リストがいくつかあります。デフォルトの値のリストは決して変更されるべきではありません。そのため、値を設定するときは、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;
}
より速い方法はありますか?