2016-03-23 34 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これは役に立ちます。 –

関連する問題