2014-07-04 46 views
3

我有5個鑰匙,不能刪除/更新。我提供了我自己的方法來添加,獲取和刪除這個HashMap的密鑰。是否可以使某個HashMap的某些特定鍵爲只讀?

UnmodifiableMap將使所有密鑰爲只讀,所以我也不能使用它。我可以保留這些只讀密鑰的List,並且無論何時調用添加/刪除方法,我都可以參考此List並阻止該操作。但是有沒有其他更好的方法來實現這一目標?

在此先感謝!

編輯:我知道我可以延長HashMap並覆蓋put方法。這與我在上述問題描述中所說的類似(維護只讀密鑰的List並防止對它們進行操作)。我認爲可能有辦法將UnmodifiableMap合併到HashMap中,使得UnmodifiableMap中的密鑰在新的HashMap中保持只讀狀態,其他密鑰將支持所有操作。

+0

您可以擴展'HashMap'並重寫'put()'方法來輕鬆地實現這種機制。 –

+0

有什麼理由不能只擁有2張地圖?一個可以修改,一個不可以? –

+0

我可以。但是,每當Get被調用時,我都需要檢查兩個'Maps'。 –

回答

6

由於Andre提到,您可以繼承HashMap或其他Map實現。

下面是一個匿名類簡單的例子,自包含的main方法:

public static void main(String[] args) { 
    Map<String, String> myMap = new HashMap<String, String>() { 

     private static final long serialVersionUID = 6585814488311720276L; 
     @Override 
     public String put(String key, String value) { 
      if (key != null && !key.equalsIgnoreCase("foo")) { 
       return super.put(key, value); 
      } 
      else { 
       throw new IllegalArgumentException("No foo's allowed!"); 
      } 
     } 
     // TODO! 
     @Override 
     public void putAll(Map<? extends String, ? extends String> m) { 
      // TODO Auto-generated method stub 
      super.putAll(m); 
     } 
    }; 
    System.out.println(myMap.put("blah", "blah")); 
    System.out.println(myMap.put("foo", "blah")); 
} 

輸出

null 
Exception in thread "main" java.lang.IllegalArgumentException: No foo's allowed! 
    at test.Main$1.put(Main.java:18) 
    at test.Main$1.put(Main.java:1) 
    at test.Main.main(Main.java:29) 
0

創建Map將封裝其他兩張地圖。其中一張地圖將是一張不可修改的地圖,將包含您的只讀密鑰,另一張將是常規的HashMap

當你得到一個密鑰時,查看這兩個地圖,從不可修改的地圖開始。放入時,在檢查該鍵尚未在第一張地圖中之後,僅使用第二張地圖。

相關問題