निम्नलिखित कोड दिया गया है:
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
}
ऐसा लगता है, जाहिर है, कि सरणी की toString
, equals
विधियों का उपयोग किया जाता है (स्थिर विधियों के बजाय Arrays::equals
, Arrays::deepEquals
या Array::toString
)।
इसलिए मुझे लगता है कि जावा 14 रिकॉर्ड्स ( जेईपी 359 ) सरणियों के साथ बहुत अच्छी तरह से काम नहीं करते हैं, संबंधित तरीकों को एक आईडीई (जो कम से कम इंटेलीज में उत्पन्न होता है, डिफ़ॉल्ट रूप से "उपयोगी" तरीके से उत्पन्न होता है, अर्थात वे स्थैतिक तरीकों का उपयोग करते हैं) में Arrays
)।
या कोई और उपाय है?
toString()
, equals()
और hashCode()
एक रिकार्ड के तरीकों लागू किया जाता है एक invokedynamic संदर्भ का उपयोग करते हुए। । यदि केवल संकलित वर्ग समतुल्य हो सकता है, तो वह Arrays.deepToString
विधि जो आज उसकी निजी अतिभारित पद्धति में है, वह प्राइमिटिव मामलों के लिए हल हो सकती है।
Object
, क्योंकि उपयोगकर्ता-परिभाषित कक्षाओं के साथ भी ऐसा हो सकता है। जैसे गलत बराबरी
invokedynamic
शब्दार्थ के चयन के साथ बिल्कुल कुछ भी नहीं है; इंडी एक शुद्ध कार्यान्वयन विवरण है। कंपाइलर एक ही काम करने के लिए बायटेकोड का उत्सर्जन कर सकता था; यह वहां पहुंचने के लिए सिर्फ एक अधिक कुशल और लचीला तरीका था। रिकॉर्ड के डिजाइन के दौरान इसकी बड़े पैमाने पर चर्चा की गई थी कि क्या अधिक संतुलित समानता शब्दार्थ (जैसे सरणियों के लिए गहरी समानता) का उपयोग करना है, लेकिन यह माना जाता है कि हल करने की तुलना में अधिक समस्याओं का कारण बनता है।
List
एक सरणी के बजाय का उपयोग कर के बारे में ?