Использование NULL в качестве значения ключа на карте - PullRequest
7 голосов
/ 25 ноября 2011

Я хотел бы знать, считается ли использование NULL в качестве ключа в Map объекте хорошим стилем, и если нет, то каковы альтернативы?

Ответы [ 5 ]

8 голосов
/ 25 ноября 2011

Обычно это не считается хорошим стилем.

Так как NULL обычно указывает неопределенное или неустановленное значение, его использование в качестве ключа для карты обычно сбивает с толку. (хотя могут быть конкретные обстоятельства, в которых это имеет смысл)

Альтернативы зависят от ситуации, поэтому позвольте мне привести пример. Допустим, мы хотим, чтобы в тексте были специфические для цвета строки, а также для цвета по умолчанию, который не соответствует ни одной из строк.

private HashMap<String,Color> stringColors;
private Color defaultColor;

Вместо сохранения цвета по умолчанию в HashMap с помощью клавиши NULL, поместите цвет по умолчанию в определенную переменную. Это позволяет каждому, кто просматривает код, точно понять, что означает этот цвет.

Движущий фактор, я бы сказал, заключается в том, есть ли у вас значение NULL, которое можно непосредственно посмотреть на карте. (по моему опыту это случается не часто). В этом конкретном примере, который я привел, цвет по умолчанию будет использоваться для любых строк, которых нет на карте. В этом случае нет строки NULL, для которой требуется цвет.

3 голосов
/ 25 ноября 2011

Я бы лично рекомендовал использовать нулевой объект (см. Шаблон нулевого объекта ) или какой-то ключ по умолчанию, а не null в качестве ключа. Использование null всегда означает, что вы должны написать код для защиты от NullPointerException, и его следует по возможности избегать.

Редактировать

Например, если вы создаете API, который позволит пользователям добавлять значения на карту (будь то реализация Map собственного производства или класс утилит, использующий карту для хранения своих данных) и ваш первый версия позволяет им использовать null в качестве ключа, вы всегда должны поддерживать null ключи. Так что либо ваша поддержка Map должна быть реализацией, которая принимает ключи null, либо вам придется перехватывать ключи suck и заменять их другим ключом, который будет представлять ключ null.

Как упомянул @Erick Robertson, есть случаи, когда имеет смысл принимать null ключей. Однако, если вы разрабатываете API, вы должны убедиться, что хотите обрабатывать такие ключи, так как это всегда означает, что для проверки null требуется больше кода. И это также означает более защитный код для клиентов вашего API.

0 голосов
/ 12 ноября 2014

Обычно нулевые ключи и нулевые значения имеют плохой стиль.

На сайте Google Guava есть две замечательные страницы, которые объясняют, как и почему не использовать Null.

LivingWithNullHostileCollections - Как справиться с коллекциями, которые не допускают ноль

UsingAndAvoidingNullExplained - Инструменты гуавы для использования и исключения использования null, объяснено.

Цитата:

Но что, если?

Что если вы захотите положить нулевой элемент в одного из этих враждебных ноль зверей?

  • Если в наборе или как ключ на карте - не надо; понятнее (менее удивительно), если во время операций поиска вы явно указываете null на ноль
  • Если в качестве значения на карте - пропустить эту запись; хранить отдельный набор ненулевых ключей (или нулевых ключей)
  • Если в списке - если список редок, вы могли бы использовать карту?
  • Подумайте, существует ли естественный «нулевой объект», который можно использовать. Там не всегда. Но иногда. пример: если это enum, добавьте константу, чтобы обозначить то, что вы ожидаете, что значение null будет здесь.
  • Просто используйте другую реализацию коллекции, например Collections.unmodifiableList (Lists.newArrayList ()) вместо ImmutableList.
  • Маскировать нули (это требует более подробной информации)
  • Использование Дополнительно
0 голосов
/ 25 ноября 2011

Попробуйте использовать что-то вроде DefaultsMap , которое возвращает известное значение, если карта не содержит заданный ключ.

В зависимости от вашего варианта использования, это может быть чище, чем при использовании (a) ключ null или (б) объект NullObject.Если вы опишите свой фактический вариант использования, вам будет проще помочь.

0 голосов
/ 25 ноября 2011

Иногда полезно сохранить значение по умолчанию на карте как значение ключа Null. Я не знаю других случаев. Но это законно, так почему бы и нет, если это может принести какую-то прибыль?

...