2010-08-18 2 views
2

Я недавно наткнулся на набор кода, который конкретизируется локальные карты следующим образом:Typing конвенции для местных коллекций в Java

HashMap<String, Object> theMap = new HashMap<String, Object>(); 

Обычно, когда я видел HashMaps использовали (и используют их сам), местный переменные - это просто Map (интерфейс), а не привязаны к конкретной реализации. Очевидно, это необходимо, если Map потенциально может быть создан как различные типы Map (например, принимает параметр). Однако, в случае что-то вроде выше, где оно определено и создается в одной точке, есть ли основная причина использовать только тип интерфейса или просто стиль/соглашение?

+1

«Ввод текста» представляется более подходящим, чем «соглашение об именах». –

+0

Действительно. Имя обновлено, но я не могу создать этот тег w/my rep. Если кто-то другой, не стесняйтесь. – Dusty

ответ

7

(изначально я неправильно понял вопрос, основанный на названии, но я включил оба типа и переменные соглашения, как и интересны.)

Что важно, что это карта: то, что вы смотрите вещи в. Остальное - деталь реализации.

Я бы предложил дать ему semantic имя, например.

Map<String, Object> nameToSessionMap = ... 

... таким образом, когда вы читаете код, вы будете знать, что означают ключи и значения.

Что касается типа переменной - опять-таки, я обычно использовал интерфейс, а не реализацию, частично потому, что он указывает, что я не использую какие-либо элементы, которые относятся к типу. Я не хочу, чтобы подчеркнуть реализации в коде, обычно ... это означает, когда я сделать заботиться об осуществлении, я могу сделать это более очевидным.

+0

Я все на борту семантического именования.Мой пример - это просто типичная игрушка для целей вопроса, но хорошая точка. – Dusty

+0

У меня был друг в классе CS средней школы, который полностью противопоставлял то, что вы предлагаете. Он использовал имена переменных/функций, которые были совершенно не связаны с семантикой, поэтому его код выглядел примерно так: «int dolphin = слон (морж, обезьяна)». Вы можете себе представить, насколько преподаватель любил оценивать его работу. ;-) –

6

Объявление объекта как Map позволит компилятору защитить вас от методов вызова, которые относятся к HashMap. Это позволит вам заменить другую реализацию Map в будущем, не беспокоясь о вызовах методов, которых нет в интерфейсе Map.

+1

Определенно на борту с этой точкой. Красота передачи 'theMap' в качестве« карты »вместо« HashMap »заключается в том, что если позже вы решите, что хотите дерево двоичного поиска (TreeMap) или синхронизированную Hashtable, все, что вам нужно сделать, это изменить свою декларацию на 'Map theMap = new TreeMap ();' вместо этого. Остальная часть вашего кода не потребуется изменять. –

1

Обычно люди используют в основном карту, чтобы сделать наименьшее количество предположений о реализации.

Не может быть, чтобы имя класса использовалось для дополнительных методов, так как к ним добавлен только clone(), который уже не использовался (по уважительным причинам).

Возможно, что карта должна быть Serializable по той или иной причине, а простой интерфейс карты не расширяет ее, но HashMap ее реализует.

1

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

Смежные вопросы