একটি চ্যালেঞ্জের জন্য, একজন সহকর্মী গল্ফার নিম্নলিখিত কোডগুলি লিখেছিলেন :
import java.util.*;
public class Main {
public static void main(String[] args) {
int size = 3;
String[] array = new String[size];
Arrays.fill(array, "");
for(int i = 0; i <= 100; ) {
array[i++%size] += i + " ";
}
for(String element: array) {
System.out.println(element);
}
}
}
জাভা 8 এ এই কোডটি চালানোর সময়, আমরা নিম্নলিখিত ফলাফলটি পাই:
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100
2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77 80 83 86 89 92 95 98 101
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
জাভা 10 এ এই কোডটি চালানোর সময়, আমরা নিম্নলিখিত ফলাফলটি পাই:
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
নম্বরটি জাভা 10 ব্যবহার করে পুরোপুরি বন্ধ রয়েছে So তাই এখানে কী হচ্ছে? এটি কি জাভা 10-এ একটি বাগ আছে?
মন্তব্যগুলি থেকে অনুসরণ করুন:
- জাভা 9 বা তার পরে সংকলিত হওয়ার পরে সমস্যাটি উপস্থিত হয় (আমরা এটি জাভা 10 তে পেয়েছি)। জাভা 8 এ এই কোডটি সংকলন করুন, তারপরে জাভা 9 বা জাভা 11 প্রারম্ভিক অ্যাক্সেস সহ পরবর্তী কোনও সংস্করণে চলমান প্রত্যাশিত ফলাফল দেয়।
- এই জাতীয় কোডটি মানহীন, তবে অনুমান অনুসারে বৈধ। এটা তোলে মাধ্যমে পাওয়া গেছে কেভিন Cruijssen একটি একটি আলোচনা golfing চ্যালেঞ্জ , অত অদ্ভুত ব্যবহারের ক্ষেত্রে সম্মুখীন হয়েছে।
ডিডিয়ার এল আবিষ্কার করেছেন যে সমস্যাটি আরও ছোট এবং আরও বোঝার কোড সহ পুনরুত্পাদন করা যেতে পারে:
class Main { public static void main(String[] args) { String[] array = { "" }; array[test()] += "a"; } static int test() { System.out.println("evaluated"); return 0; } }
জাভা 8 তে সংকলিত হওয়ার পরে ফলাফল:
evaluated
জাভা 9 এবং 10 এ সংকলিত হওয়ার পরে ফলাফল:
evaluated evaluated
ইস্যু স্ট্রিং সংযুক্তকরণের এবং নিয়োগ অপারেটর (সীমাবদ্ধ হবে বলে মনে হয়
+=
বাম প্রতীক হিসাবে, পার্শ্ব প্রতিক্রিয়া (গুলি) সঙ্গে একটি অভিব্যক্তি সঙ্গে) মতarray[test()]+="a"
,array[ix++]+="a"
,test()[index]+="a"
, অথবাtest().field+="a"
। স্ট্রিং কনটেনটেশন সক্ষম করতে, কমপক্ষে একটি পক্ষের অবশ্যই টাইপ থাকতে হবেString
। অন্যান্য ধরণের বা নির্মাণের ক্ষেত্রে এটি পুনরুত্পাদন করার চেষ্টা ব্যর্থ হয়েছে।
+=
পরোক্ষ String
রেফারেন্সগুলিতে সীমাবদ্ধ । সুতরাং প্রথমে, আপনার অ্যারে অবশ্যই একটি হতে হবে String[]
। সমস্যার সাথে ঘটবে না int[]
, long[]
বন্ধু এবং। তবে হ্যাঁ, আপনি মূলত ঠিক বলেছেন!
String[]
। যদি এটি হয় Object[]
এবং আপনি করেন তবে এটি array[expression] += "foo";
একই রকম। তবে হ্যাঁ, এটা আদিম অ্যারে প্রযোজ্য নয়, যেমন ধরনের রেফারেন্স রাখা সক্ষম হওয়া আবশ্যক String
( Object[]
, CharSequence[]
, Comparable[]
, ...), স্ট্রিং সংযুক্তকরণের ফল সঞ্চয় করতে।