簡體   English   中英

如何將可變對象編排為跨對象不可變

[英]How to orchestrate mutable object as immutable across objects

我有一個像這樣的java類

class Runner {
  public Object run(Map<String, Object> input);
  public String name();
}

public class Test {

  public static void main(String args[]) {  
    Map<String, Object> map = Maps.newHashMap();
    List<Runner> runners;
    forEach(Runner runner: runners) {
      Object obj = runner.run(map);
      map.put(runner.name(), obj);
    }
  }

}

在上面的代碼中,我正在調用Runner類的run方法,並將其產生的輸出添加到Map <>對象。 對運行器對象列表重復此操作。 如何使映射對象作為輸入傳遞給run方法不可變? 我考慮過從地圖創建不可變地圖,並將其作為輸入參數傳遞。 但是我擔心我可能會創建的不可變映射的數量取決於執行的運行程序對象的數量,這可能導致OOM錯誤。 是否有任何可用的模式或解決方案? 任何建議,將不勝感激。

如果您只是通過run方法中的鍵獲取地圖值,則可以將MapFunction接口包裝在一起:

class Runner {
  public Object run(Function<String, Object> getter) {}
  public String name() {}
}

public static void main(String args[]) {  
  Map<String, Object> map = new HashMap<>();
  List<Runner> runners;
  for(Runner runner: runners) {
    Object obj = runner.run(map::get);
    map.put(runner.name(), obj);
  }
}

您可以通過可修改的地圖來支持不可修改的地圖。

它們具有相同的基礎數據,但是在不可修改的包裝器中限制了對setter API的訪問。

即使您正在從不可修改的地圖中進行讀取,以下代碼段在更新可修改的地圖時也會打印1 您可能會注意到,它不會創建地圖數據的兩個副本,它們只是共享相同的值。

Map<String, String> modifiableMap = new HashMap<>();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);
modifiableMap.put("a", "1");
System.out.println(unmodifiableMap.get("a"));

但是,嘗試unmodifiableMap.put("a", "1")將導致UnsupportedOperationException


對於您的代碼,您可以嘗試如下操作:

public static void main(String args[]) {
    Map<String, Object> modifiableMap = Maps.newHashMap();
    Map<String, Object> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);
    List<Runner> runners;
    forEach(Runner runner: runners) {
        Object obj = runner.run(unmodifiableMap);
        modifiableMap.put(runner.name(), obj);
    }
}

暫無
暫無

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

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