Есть довольно много проблем, но самая большая проблема, которую я вижу, это то, что вы используете сцепленный String
в качестве ключа. Следующие два вызова различны, но эквивалентны:
final MyHashMap map = new MyHashMap();
map.put("foo", "", "baz", new Object());
map.put("", "foo", "baz", new Object()); // Overwrites the previous call
Существует также проблема, связанная с тем, что вы объявляете тип ключа как Object
, но всегда используете String
и, следовательно, не пользуетесь безопасностью типов, которая поставляется с обобщениями. Например, если вы хотите перебрать keySet
вашего Map
, вам придется привести каждую Set
запись к String
, но вы не можете быть уверены, что кто-то не оскорбил вас. Map
с помощью клавиши Integer
, например.
Лично я бы предпочел бы композицию, а не наследование , если у вас нет веских причин не делать этого. В вашем случае MyHashMap
- это перегрузка стандартные Map
методы put
, get
и remove
, но не перекрывают ни один из них. Вы должны наследовать от класса, чтобы изменить его поведение, но ваша реализация этого не делает, поэтому составление - это очевидный выбор.
Например, перегрузка, а не переопределение означает, что если вы сделаете следующее объявление:
Map<Object, Object> map = new MyHashMap();
нет из ваших заявленных методов будут доступны. В соответствии с рекомендациями некоторых других ответов, было бы гораздо лучше использовать объект, состоящий из firstName, lastName и address, в качестве ключа карты, но вы должны помнить о реализации equals
и hashCode
, иначе ваши значения будут не может быть извлечено из HashMap
.