Я определил следующие классы, пытающиеся сделать «IamImmutable.class» неизменным. Но когда я изменяю значения hashmap в TestingImmutability.class после инициализации IamImmutable, изменения применимы к Hashmap. Hashmap будет ссылаться на тот же объект, даже если мы создадим его с помощью нового HashMap (старого). Мне нужно сделать Hashmap в неизменном экземпляре. Я пробовал итерацию и копирование значений, но это не работает. Может ли кто-нибудь предложить, как действовать?Пример неизменяемого класса с hashmap
package string;
import java.util.HashMap;
import java.util.Map.Entry;
public final class IamImmutable {
private int i;
private String s;
private HashMap<String, String> h;
public IamImmutable(int i, String s, HashMap<String, String> h) {
this.i = i;
this.s = s;
this.h = new HashMap<String, String>();
for (Entry<String, String> entry: h.entrySet()) {
this.h.put((entry.getKey()), entry.getValue());
}
}
public int getI() {
return i;
}
public String getS() {
return s;
}
public HashMap<String, String> getH() {
return h;
}
}
И тест:
package string;
import java.util.HashMap;
import java.util.Map.Entry;
public class TestingImmutability {
public static void main(String[] args) {
int i = 6;
String s = "[email protected]";
HashMap<String, String> h = new HashMap<String, String>();
h.put("Info1", "[email protected]");
h.put("Inf02", "!amCrazy6");
IamImmutable imm = new IamImmutable(i, s, h);
h.put("Inf02", "!amCraxy7");
System.out.println(imm.getS() + imm.getI());
for (Entry<String, String> entry: h.entrySet())
System.out.println(entry.getKey() + " --- " + entry.getValue());
}
}
Ожидаемый результат:
[email protected] John6 Inf02---!amCrazy6 [email protected] John
Фактический выход:
[email protected] John6 Inf02---!amCraxy7 [email protected] John
см. Http://stackoverflow.com/questions/9043254/how-to-get-a-immutable-collection-from-java-hashmap – slipperyseal