নিম্নলিখিত কোড দেওয়া:
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 ) অ্যারেগুলির সাথে খুব ভাল কাজ করে না, সম্পর্কিত পদ্ধতিগুলি একটি আইডিই দিয়ে তৈরি করতে হবে (যা অন্তত IntelliJ এ, ডিফল্টরূপে "দরকারী" পদ্ধতি উত্পন্ন করে, যেমন তারা স্থির পদ্ধতিগুলি ব্যবহার করে) in Arrays
)।
নাকি অন্য কোন সমাধান আছে?
toString()
, equals()
এবং hashCode()
রেকর্ড পদ্ধতি প্রয়োগ করা হয় একটি invokedynamic রেফারেন্স ব্যবহার করে। । যদি কেবল সংকলিত শ্রেণীর সমতুল্য Arrays.deepToString
পদ্ধতিটি আজ তার ব্যক্তিগত ওভারলোডেড পদ্ধতিতে কী করে তার কাছাকাছি থাকতে পারত , তবে সম্ভবত এটি আদিমতার ক্ষেত্রে সমাধান করতে পারত।
invokedynamic
শব্দার্থবিজ্ঞানের বাছাইয়ের সাথে একেবারেই কিছু করার নেই; indy এখানে একটি বিশুদ্ধ বাস্তবায়ন বিশদ। সংকলক একই কাজ করতে বাইটোকড নির্গমন করতে পারে; এটি সেখানে পৌঁছানোর আরও কার্যকর এবং নমনীয় উপায় ছিল। রেকর্ডগুলির ডিজাইনের সময় এটি আরও সংখ্যক সামঞ্জস্যপূর্ণ সাম্যবাদী শব্দ ব্যবহার করতে হবে (যেমন অ্যারেগুলির জন্য গভীর সমতা) ব্যবহার করার বিষয়ে ব্যাপক আলোচনা করা হয়েছিল, তবে এটি সম্ভবত এটির সমাধানের চেয়ে আরও বেশি সমস্যার কারণ হতে পারে।
List
অ্যারের পরিবর্তে ব্যবহার সম্পর্কে কীভাবে ?