Лучшие практики Java: Поместите / Получите объекты SubClass в HashMap, который ожидает объекты SuperClass - PullRequest
4 голосов
/ 01 сентября 2011

Допустим, я создаю экземпляр HashMap с SuperClass в качестве типа значения.Затем я добавляю SubClass объекты в качестве значений на карту.Когда я извлекаю эти значения из карты, они возвращаются как объекты типа SuperClass, которые я явно возвращаю к Subclass:

class SuperClass {}

class SubClass1 extends SuperClass { int one;}

class SubClass2 extends SuperClass { int two;}

class DoSomething {

   DoSomething() {
      Map<String, SuperClass> map = new HashMap<String, SuperClass>();

      map.put("1", new SubClass1());
      map.put("2", new SubClass2());

      SubClass1 one = (SubClass1) map.get("1");
   }
}

. Мне нужно знать, что возвращаемый объект имеетспецифический SubClass, потому что я хочу получить доступ к методам, которые существуют только в подклассе.Если возвращаемым типом может быть любое количество различных подклассов, считается ли использование instanceof лучшей практикой для определения типа и приведения?

SuperClass s = map.get("1");
if (s instanceof SubClass1) {
  (SubClass1)s.one = 1;
}

Спасибо

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Существует несколько способов сделать это в зависимости от конкретной ситуации:

  • Добавить абстрактный метод в суперкласс для выполнения соответствующей операции.
  • Использовать адаптер в качестветип значений карты.При добавлении записей используйте специализацию адаптера для соответствия подтипу.
  • Отдельные карты.Особенно хорошо, если они не должны были быть на одной и той же карте.
2 голосов
/ 01 сентября 2011

Лучше всего помещать каждый тип подкласса в отдельную карту.

Использование instanceof перед выполнением приведения, если вам действительно нужно выполнить это приведение, это хорошая идея, поскольку таким образом вы предотвратитеClassCastException.

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

Если вы хотите поместить их в одну и ту же карту, вам нужно подумать оВаш дизайн:

хотите, чтобы ваш класс DoSomething знал о различных типах подкласса для выполнения определенной операции? Я вижу 3 возможности:

  1. Да, DoSomething должен знать обо всех ваших подклассахтипы.Тогда не беспокойтесь, выполните проверку с instanceof и приведите объект, извлеченный из карты, или, лучше, сохраните их в разных Картах.
  2. Нет, DoSomething не должен знать о другом подклассе, потому чтоМожно использовать их бросить общий интерфейс SuperClass.Это хороший дизайн.
  3. Вы не хотите, чтобы DoSomething знал о различных типах подкласса, но в определенной ситуации вы чувствуете необходимость использовать некоторые методы, специфичные для подкласса: рефакторинг вашего кода, у вас неправильный дизайн.
0 голосов
/ 01 сентября 2011

Да, вы обязательно должны использовать instanceof, чтобы быть безопасным. Иначе как бы вы узнали, является ли объект, который вы вытащили, правильным подклассом?

...