Необходимо знать о том, что исходная попытка
int count = map.containsKey(word) ? map.get(word) : 0;
содержит две потенциально дорогих операции на карте, а именно, containsKey
и get
. Первый выполняет операцию, потенциально симпатичную подобный последнему, таким образом, Вы делаете ту же работу дважды !
при рассмотрении API для Карты, get
операции обычно возвращаются null
, когда карта не содержит требуемый элемент.
Примечание, что это сделает решение как [1 132]
map.put( key, map.get(key) + 1 );
опасным, так как оно могло бы уступить NullPointerException
с. Необходимо проверить на null
сначала.
Также примечание , и это очень важно, тот HashMap
, s может содержать nulls
по определению. Так не каждый возвращенный null
говорит, что "нет такого элемента". В этом отношении, containsKey
ведет себя по-другому от [1 113] в фактическом сообщении Вам ли существует такой элемент. Обратитесь к API для деталей.
Для Вашего случая, однако, Вы не могли бы хотеть различать сохраненный null
и "noSuchElement". Если Вы не хотите разрешать null
с, Вы могли бы предпочесть Hashtable
. Используя библиотеку-оболочку, как был уже предложен в других ответах, могло бы быть лучшее решение ручной обработки, в зависимости от сложности Вашего приложения.
Для завершения ответа (и я забыл вставлять это сначала благодаря функции редактирования!), лучший способ сделать его исходно, к [1 117] в final
переменная, проверьте на [1 119], и put
это въезжает задним ходом с 1
. Переменная должна быть final
, потому что это неизменно так или иначе. Компилятору, возможно, не понадобилась бы эта подсказка, но его более ясное тот путь.
final HashMap map = generateRandomHashMap(); final Object key = fetchSomeKey(); final Integer i = map.get(key); if (i != null) { map.put(i + 1); } else { // do something }
, Если Вы не хотите полагаться на автоупаковку, необходимо сказать что-то как [1 123] вместо этого.
Это можно сделать с помощью Post Sharp . См. Инструкции в демонстрационном видео.
Я добиваюсь этого с помощью фреймворков AOP , таких как Castle Dynamic Proxy , Spring.NET или даже ] Блок приложения для внедрения политики .
вы можете добиться этого с помощью "ContextBoundObject" в .NET framework. но он немного запутан, потому что в основном использует инфраструктуру удаленного взаимодействия .net для перехвата вызовов методов. (накладные расходы времени выполнения минимальны, если ваши вызовы находятся в одном домене приложения, но только в другом «контексте»). так что лучшие подходы будут те, которые упомянуты выше другими плакатами.