卵:
私はすべて私が働いているコードベースを中心に、このようなコードを持っています:
Map<String, Map<Object, Integer>> mapOfMap = new HashMap<>();
Map<Object, Integer> mapA = mapOfMap.computeIfAbsent(keyParam, k -> new HashMap<>());
mapA.put(objectParam, mapA.getOrDefault(objectParam, 0) + 1);
このように、我々はPUT()メソッドを直接呼び出すことなく、第1のマップの「keyParam」の値を更新しました。
私はコードが明示的であると一般的に「プット」に平野の呼び出しを記述したときに好む傾向にあります。私はそれをoverthinkingだし、この簡潔にはオブジェクト参照を持つために私たちが得るものですしかし、私は思ったんだけど?これは、オブジェクトは不変であるふりをJavaでも同様に簡潔な方法で記述することができますか?
kutschkem:
それは、この場合にあってもよいが、できません。
この場合、コードは、それはおそらく、やっている知っています。多分変更可能であることをオブジェクトに対してintededています。これを回避する唯一の方法は、値オブジェクトをコピーし、それを変異させ、その後、再びそれを入れています。これはまた、私はスタイルが本当に優れているならば、私はそれが発生しやすい、より読みやすいか、常に以下のエラーになります感じていないことを確認していない、いくつかのプログラムでは非常に高価である可能性があります。それはあなたが一般的で不変オブジェクトを信じてどのくらいに依存します。
物事が変異しているときに問題がある場合は、それはなってないことがあってはなりません。しかし、これは、それ自体のマップとは何の関係もありません。
例えば:
このようにgithubの上の問題、不変であると仮定されているリストを参照し、この場合には少なくともメモリリークにつながる、それを変異し、コードの一部に渡されます。