Sadece sorun karşısında tökezledim ve bir şey eksik mi, yoksa bir şey kırılmış mı?Google guava ImmutableList eşittir Yöntemi, java.utils.List, Liste-Arabirim sözleşmesinin kırılmasından farklı bir sonuç döndürüyor mu?
Ben google guava kullanıyorum (19.0). Ve eşitsizliğe karşı ImmutableLists'i test ettiğimde balık gibi bir şey oldu. Javadoc olarak
i ImmutableList ait equals metodu, java tarafından verilen sözleşme, takip edeceğini varsaymak olur, bu ImmutableList java.util.List Interface Bu nedenle http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableList.htmluygulayan söylüyor ImmutableList için. util.List, aynı sonucu aynı liste için döndürür
List.equals() 'da, diyor ki [...] Diğer bir deyişle, iki liste aynı öğeleri içeriyorsa eşit olarak tanımlanır. Aynı sıralama Bu tanım, eşit yöntemin, Liste arayüzünün farklı uygulamalarında düzgün şekilde çalışmasını sağlar. "
https://docs.oracle.com/javase/6/docs/api/java/util/List.html#equals(java.lang.Object)
Şimdi bu küçük kod örneğinde Şimdi
ImmutableList.Builder<String> builder1 = new ImmutableList.Builder<>();
builder1.add("Test1");
List<String> list1 = builder1.build();
ImmutableList.Builder<String> builder2 = new ImmutableList.Builder<>();
builder1.add("Test1");
List<String> list2 = builder2.build();
System.out.println(list1.equals(list2));
//--> false
List<String> defaultList1 = new LinkedList<>();
defaultList1.add("Test1");
List<String> defaultList2 = new LinkedList<>();
defaultList2.add("Test1");
System.out.println(defaultList1.equals(defaultList2));
// --> true
düşünmek, ne çıktı beklenir?
Her iki test için de true olmasını bekledim. Ancak gerçek çıktı farklıdır. Eşitliğin java sürümü beklendiği gibi doğru döner. Ancak guava sürümü yanlış döndürür. Google immutableList için javadoc'a bir göz attıysanız, eşittir yönteminin o1 == o2 (List-Interface sözleşmesini ihlal eden) döndürdüğünü belirtir. Öyle anladım NEDEN kod örneğim çalıştığı şekilde çalışıyor.
Bu google adamlar tarafından bir "böcek", ama Iterfaces benim anlayış ile bir sorun değildir ve (davanız Builder1 olarak) aynı oluşturucu öğesi ekliyoruz
bu iki çizgi 'ImmutableList.Builder çok dikkatli bir şekilde Görünüş builder2 = Yeni ImmutableList.Builder <>(); builder1.add ("Test1"); ' –