Java最佳实践:将/获取SubClass对象放入需要SuperClass对象的HashMap中

时间:2011-08-31 20:20:38

标签: java hashmap subclass superclass

假设我将SuperClass实例化为值类型的HashMap。然后我将SubClass个对象作为值添加到Map中。当我从Map中检索这些值时,它们将作为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,因为我想访问仅存在于SubClass中的方法。如果返回的类型可以是任意数量的不同子类,那么在确定类型和转换时使用instanceof是最佳实践吗?

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

由于

3 个答案:

答案 0 :(得分:4)

根据具体情况,有很多方法可以解决这个问题:

  • 向超类添加抽象方法以执行相关操作。
  • 使用适配器作为地图值的类型。添加条目时,使用适配器的特化来匹配子类型。
  • 单独的地图。特别好,如果他们不应该首先在同一张地图上。

答案 1 :(得分:2)

最佳做法应该是将每个SubClass类型放在不同的Map中。

在执行强制转换之前使用instanceof,如果你真的需要进行强制转换,那么这是一个好主意,因为这样可以防止出现ClassCastException。

请注意,如果您的代码有很多instanceof指令,那么您的设计可能会很糟糕。

如果您想将它们放在同一个地图中,那么您需要考虑您的设计:

让你的DoSomething类知道不同的SubClass类型来执行特定的操作吗?我看到3种可能性:

  1. 是的,DoSomething必须知道所有的SubClass类型。然后别担心,使用instanceof执行检查并投射从地图检索到的对象,或者更好地将它们存储到不同的地图中。
  2. 不,DoSomething不需要知道不同的SubClass,因为可以使用它们抛出公共接口SuperClass。那是个好设计。
  3. 你不希望DoSomething知道不同的SubClass类型,但在某些情况下你觉得需要使用一些子类特定的方法:重构你的代码,你的设计是错误的。

答案 2 :(得分:0)

是的,你绝对应该使用instanceof来进行类型安全。否则,你怎么知道你拔出的对象实际上是否是正确的子类?