2017-01-05 6 views
2

J'utilise le java immutables library.java org.immutables library: toute l'insertion en double dans la carte

@Value.Immutable 
public interface Foo { 
    Map<Integer, String> getBar(); 
} 

ImmutableFoo.builder().putBar(1, "asdf").putBar(1, "ghjk").build() provoque une erreur de clé en double. y-a-t-il un moyen d'éviter ça?

  • Si je me trouve sur la même clé avec une valeur différente, je voudrais remplacer l'ancienne valeur avec la nouvelle valeur.
  • Si j'arrive sur la même clé avec la même valeur, je voudrais l'ignorer.
+0

Que voulez-vous accomplir? –

+0

Je souhaite remplacer les anciennes valeurs par de nouvelles valeurs/ignorer les erreurs en double s'il s'agit de la même valeur. – lf215

+0

Essayez d'utiliser le hashmap par défaut peut-être? Cela aide dans votre cas –

Répondre

2

Le générateur généré le fait intentionnellement pour empêcher (effectivement détecter tôt) les fautes de frappe et de copier-coller accidentelles. En cela, il imite en fait le comportement de ImmutableMap.Builder de Guava (qui est réellement utilisé en interne et est responsable de cette erreur). Pour résoudre votre problème, la meilleure façon de gérer cela est de créer votre propre carte de hachage, de la remplir avec des valeurs dans n'importe quel ordre et avec n'importe quel nombre d'entrées dupliquées/surchargées, puis d'utiliser builder.putAllBar(hashMap) pour l'appliquer et la transformer en carte immuable pendant la création d'objets de valeur.

L'autre option est de ne pas utiliser Guava, le code généré utilisera alors le HashMap et créera une copie défensive enveloppée dans Collection.unmodifiableMap pour l'objet immuable. Utilisez @Value.Style(jdkOnly = true) pour utiliser uniquement les collections fournies par JDK (en savoir plus sur les styles ici: http://immutables.github.io/style.html). En utilisant une carte de hachage régulière dans un générateur, vous éviterez d'avoir l'erreur de clé dupliquée.