Aşağıdaki kod verildiğinde:
public static void main(String[] args) {
record Foo(int[] ints){}
var ints = new int[]{1, 2};
var foo = new Foo(ints);
System.out.println(foo); // Foo[ints=[I@6433a2]
System.out.println(new Foo(new int[]{1,2}).equals(new Foo(new int[]{1,2}))); // false
System.out.println(new Foo(ints).equals(new Foo(ints))); //true
System.out.println(foo.equals(foo)); // true
}
O dizinin, belli ki, görünüyor toString
, equals
yöntemler (yerine statik yöntemler kullanılır Arrays::equals
, Arrays::deepEquals
ya da Array::toString
).
Yani Java 14 Kayıtları ( JEP 359 ) dizilerle çok iyi çalışmıyor, ilgili yöntemlerin bir IDE (en azından IntelliJ'de, varsayılan olarak "yararlı" yöntemler üreten, yani statik yöntemleri kullandıkları bir IDE ile oluşturulması gerekir içinde Arrays
).
Yoksa başka bir çözüm var mı?
toString()
, equals()
Ve hashCode()
bir kayıt yöntemleri uygulanmaktadır bir invokedynamic referans kullanarak. . Arrays.deepToString
Günümüzde yalnızca derlenmiş sınıf eşdeğeri, yöntemin aşırı yüklenmiş özel yönteminde ne yaptığına yakın olsaydı , ilkel durumlar için çözülmüş olabilir .
Object
, kullanıcı tanımlı sınıflarda da olabileceğinden geri dönmek kötü bir fikir değildir . örneğin yanlış eşittir
invokedynamic
semantik seçimiyle hiçbir ilgisi yoktur; indy burada saf bir uygulama detayı. Derleyici aynı şeyi yapmak için bayt kodu yayınlayabilirdi; bu sadece oraya ulaşmak için daha verimli ve esnek bir yol oldu. Kayıtların tasarımı sırasında daha nüanslı bir eşitlik anlambilimi (diziler için derin eşitlik gibi) kullanıp kullanmayacağı kapsamlı bir şekilde tartışıldı, ancak bu, tahmin edilenden daha fazla soruna yol açtığı ortaya çıktı.
List
Dizi yerine kullanmaya ne dersiniz ?