簡體   English   中英

Java最佳實踐:將/獲取SubClass對象放入需要SuperClass對象的HashMap中

[英]Java best practices: Put/Get SubClass objects into HashMap that expects SuperClass objects

假設我使用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中的方法。 如果返回的類型可以是任意數量的不同SubClasses,那么在確定類型和轉換時是否使用instanceof最佳實踐?

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

謝謝

根據具體情況,有很多方法可以解決這個問題:

  • 向超類添加抽象方法以執行相關操作。
  • 使用適配器作為映射值的類型。 添加條目時,使用適配器的特化來匹配子類型。
  • 單獨的地圖。 如果他們不應該首先在同一張地圖上,那就特別好。

最佳實踐應該是將每個SubClass類型放在不同的Map中。

在執行轉換之前使用instanceof,如果你真的需要進行轉換,那么這是一個好主意,因為這樣你就可以防止出現ClassCastException。

請注意,如果您的代碼有很多instanceof指令,那么您可能會有一個糟糕的設計。

如果你想把它們放在同一個Map中,你需要考慮你的設計:

讓你的DoSomething類知道不同的SubClass類型來執行特定的操作嗎?我看到3種可能性:

  1. 是的,DoSomething必須知道所有的SubClass類型。 然后不要擔心,使用instanceof執行檢查並轉換從地圖檢索到的對象,或者更好地將它們存儲到不同的地圖中。
  2. 不,DoSomething不需要知道不同的SubClass因為可以使用它們拋出公共接口SuperClass。 這是個好設計。
  3. 你不希望DoSomething知道不同的SubClass類型,但在某些情況下你覺得需要使用一些子類特定的方法:重構你的代碼,你的設計是錯誤的。

是的,你絕對應該使用instanceof來進行類型安全。 否則,你怎么知道你拔出的對象實際上是否是正確的子類?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM