Является ли обновление значения карты изменением ссылочной плохой практики? - PullRequest
1 голос
/ 25 марта 2020

У меня есть код, похожий на этот по всей кодовой базе, над которой я работаю:

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);

Таким образом, мы обновили значение 'keyParam' на первой карте без прямого вызова метод put ().

Я предпочитаю, чтобы код был явным и обычно писал бы простой вызов 'put'. Тем не менее, мне интересно, если я обдумываю это, и эта краткость является то, что мы получаем за наличие ссылки на объект? Может ли это быть написано таким же лаконичным образом в Java, который притворяется, что объекты неизменны?

1 Ответ

1 голос
/ 25 марта 2020

Может быть, но не в этом случае.

В этом случае код, вероятно, знает, что он делает. Возможно, он даже предназначен для изменчивости объекта. Единственный способ обойти это - скопировать объект значения, изменить его, а затем снова поместить. Это может быть довольно дорого в некоторых программах, также я не уверен, что стиль действительно лучше, я не чувствую, что он будет более читабельным или всегда менее подвержен ошибкам. Это зависит от того, насколько вы верите в неизменные объекты в целом.

Когда это становится проблемой, это когда мутируют вещи, которых не должно быть. Но это не имеет ничего общего с картами как таковыми.

Например:

В этом выпуске на github ссылка на список, который должен быть неизменным, получает передается в часть кода, которая изменяет его, что в данном случае приводит к утечке памяти.

...