5

propertyMapのコピーをpropertyMapに追加したいと思います。

  public void addProperties(Map<String, Object> propertyMap) {
    for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) {
      this.propertyMap.put(propertyEntry.getKey(), propertyEntry.getValue());
    }
  }

上記のコードはそれを行いませんが、うまくいけば意図を伝えますか?

これを行うための最良の方法は何ですか?「クローン作成」、「防御コピー」、「不変オブジェクト」、Collections.unmodizable ...などについて読んだことがありますが、以前よりも混乱しています。

私が必要とするのは、典型的なSOスタイルで、私が意味することをコードスニペットに書くためのより良い方法です。

4

2 に答える 2

3

It looks like you can just use putAll:

public void addProperties(Map<String, Object> propertyMap) {
    this.propertyMap.putAll(propertyMap);
}

This is called "defensive copying". What happens here is the values in the local propertyMap are copied into the instance's propertyMap. A weakness here is that changes the given propertyMap aren't going to be reflected in the instance's propertyMap. This is essentially creating a snapshot of the given map and copying that snapshot to the instance field map.

There are other ways of creating defensive copies as well, including clone() and the HashMap(Map) constructor.

For immutable collections, the unmodifiable methods in Collections will return collections that throw exceptions when you try to add to them. For example,

Set<String> strs = Collections.unmodifiableSet(new HashSet<String>());
strs.add("Error"); // This line throws an exception

Immutable collections protect their values by disallowing modification (removing and adding) while defensive copies protect their values by not referencing the copied collection (in other words, changes in the original collection aren't shown in the copy).

于 2012-09-11T17:11:33.540 に答える
1

キーは不変であるため、キーごとにコピーを作成することを心配する必要はないと思います。ただし、値については、それらがどのタイプのオブジェクトであるかによって異なります。それらが変更可能なオブジェクトである場合、それらすべてのコピーを作成する必要があります。

public void addProperties(Map<String, Object> propertyMap) { 
    Cloner cloner = new Cloner();
    for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) { 
        this.propertyMap.put(propertyEntry.getKey(), cloner.deepClone(propertyEntry.getValue())); 
    } 
} 

ディープ クローン ディープ クローン ユーティリティの推奨事項については、これを確認できます。

ホームページよりhttp://code.google.com/p/cloning/

重要 : Java クラスのディープ クローンは、何千ものオブジェクトがクローンされることを意味する場合があります。また、ファイルとストリームのクローンを作成すると、JVM がクラッシュする可能性があります。クローンされたクラスを表示するには、開発中にクローンされたクラスの stdout へのダンプを有効にすることを強くお勧めします。

したがって、何を複製しようとしているのかを知っておくとよいでしょう。

于 2012-09-11T17:19:46.580 に答える