2016-03-23 16 views
0

我正在嘗試從現有的ArrayList中獲取新的ArrayList並更新新列表中的字段。但它也在舊名單中得到更新。ImmutableList在更新引用列表時得到更新

我曾嘗試下面的代碼:

absoluteEntitlements = findAbsoluteEntitlements(ImmutableList.copyOf(tenantEntitlements), everyoneEntitlements, "global"); 

private List<Entitlement> findAbsoluteEntitlements(ImmutableList<Entitlement> primaryEntitlements, 
      List<Entitlement> secondaryEntitlements, String accessType) { 
     List<Entitlement> absoluteEntitlements = new ArrayList<Entitlement>(primaryEntitlements); 
    for (int i = 0; i < primaryEntitlements.size(); i++) { 
     for (int j = 0; j < secondaryEntitlements.size(); j++) { 
      if (secondaryEntitlements.get(j).equals(primaryEntitlements.get(i)) 
        && "false".equals(primaryEntitlements.get(i).getAccessType())) { 
       absoluteEntitlements.get(i).setAccessType(accessType); 
      } 
     } 
    } 
    return absoluteEntitlements; 
} 

請提供一個解決方案,我哪裏做錯了。

+6

*「我在哪做錯了」*您認爲不可變列表中的_everything_也是不可變的,但事實並非如此。 ImmutableList只是防止操作列表本身(例如添加或刪除項目)。它不能防止改變包含實例的狀態。或者讓你的Entitlement不可變(並且如果一個字段應該更新,則返回一個新的實例),或者創建一個方法來執行你的tenantEntitlements列表的深層副本(也就是說,它也複製列表中的Entitlement項) 。 – Tom

回答

0

如果您想複製自定義對象的列表,則在將對象添加到新列表之前,您必須執行克隆的對象。

List<Entitlement> absoluteEntitlements = new ArrayList<Entitlement>(); 
for (Entitlement e : primaryEntitlements) { 
    absoluteEntitlements.add(e.clone()); 
} 

確保您的Entitlement類應該支持克隆對象。

+0

感謝@Akash這是有幫助的。 –