এটির মূল্যের জন্য, বেশিরভাগ স্ক্রিপ্টিং ভাষা (পার্লের মতো) এবং নন-স্ট্যাটিক কমপাইল-টাইম ল্যাঙ্গুয়েজগুলি (পিকের মতো) স্বয়ংক্রিয় রান-টাইম ডায়নামিক স্ট্রিংকে (তুলনামূলক স্বেচ্ছাচারী) অবজেক্ট রূপান্তরকে সমর্থন করে। প্রকার-সুরক্ষা না হারিয়ে জাভাতেও এটি সম্পন্ন করা যায় এবং স্ট্যাটিকালি-টাইপ করা ভাল স্টাফগুলি গতিশীল castালাইয়ের সাথে মন্দ কাজ করে এমন কিছু ভাষায় খারাপ কাজ করে। পার্ল উদাহরণ যা কিছু প্রশ্নবিদ্ধ গণিত করে:
print ++($foo = '99'); # prints '100'
print ++($foo = 'a0'); # prints 'a1'
জাভাতে, আমি "ক্রস-কাস্টিং" বলি এমন একটি পদ্ধতি ব্যবহার করে এটি আরও ভাল (আইএমএইচও) সফল হয়। ক্রস-ingালাইয়ের সাথে, প্রতিচ্ছবিটি নির্মাণকারী এবং পদ্ধতিগুলির অলস-বোঝা ক্যাশে ব্যবহৃত হয় যা নিম্নলিখিত স্থিতিক পদ্ধতির মাধ্যমে গতিশীলভাবে আবিষ্কার করা হয়:
Object fromString (String value, Class targetClass)
দুর্ভাগ্যক্রমে, ক্লাস.কাস্টের মতো কোনও অন্তর্নিহিত জাভা পদ্ধতিগুলি স্ট্রিং টু বিগডিসিমাল বা স্ট্রিং টু ইন্টিজার বা অন্য কোনও রূপান্তরের জন্য এটি করবে না যেখানে সমর্থনমূলক শ্রেণিবদ্ধতা নেই। আমার অংশ হিসাবে, বিষয়টি হ'ল এটি অর্জনের জন্য একটি সম্পূর্ণ গতিশীল উপায় প্রদান করা - যার জন্য আমি মনে করি না যে পূর্ববর্তী রেফারেন্সটি সঠিক পদ্ধতির - প্রতিটি রূপান্তরকে কোড করার জন্য। সরল কথায় বলতে গেলে, বাস্তবায়নটি যদি আইনী / সম্ভব হয় তবে কেবল স্ট্রিং-থেকে-কাস্ট করতে হবে।
সমাধানটি হ'ল সরল প্রতিচ্ছবি হ'ল জনসাধারণের সদস্যদের সন্ধান করা:
STRING_CLASS_ARRAY = (নতুন শ্রেণি [] ring স্ট্রিং.ক্লাস});
ক) সদস্য সদস্য = টার্গেটক্লাস.সেটমথোড (মেথড.জেটনেম (), STRING_CLASS_ARRAY); খ) সদস্য সদস্য = targetClass.getConstructor (STRING_CLASS_ARRAY);
আপনি দেখতে পাবেন যে সমস্ত আদিম (পূর্ণসংখ্যা, লং, ইত্যাদি) এবং সমস্ত বেসিক (বিগইন্টিজার, বিগডিসিমাল, ইত্যাদি) এবং এমনকি java.regex.Pattern সমস্ত এই পদ্ধতির মাধ্যমে আবৃত। আমি এগুলি উত্পাদন প্রকল্পগুলিতে উল্লেখযোগ্য সাফল্যের সাথে ব্যবহার করেছি যেখানে প্রচুর পরিমাণে স্বেচ্ছাচারী স্ট্রিংয়ের মান রয়েছে যেখানে আরও কিছু কঠোর চেকিংয়ের প্রয়োজন ছিল। এই পদ্ধতির মধ্যে, যদি কোনও পদ্ধতি না থাকে বা পদ্ধতিটি আহ্বান করা হয় তখন একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় (কারণ এটি একটি অবৈধ মান যেমন একটি বিগডিসিমাল বা কোনও প্যাটার্নের জন্য অবৈধ RegEx এর একটি অ-সংখ্যাসূচক ইনপুট), যা নির্দিষ্ট করে চেক সরবরাহ করে লক্ষ্য শ্রেণীর সহজাত যুক্তি।
এর কিছুটা চলাচল রয়েছে:
1) আপনার প্রতিবিম্বটি ভালভাবে বুঝতে হবে (এটি কিছুটা জটিল এবং নবাগতদের জন্য নয়)। 2) জাভা কিছু ক্লাস এবং প্রকৃতপক্ষে তৃতীয় পক্ষের লাইব্রেরিগুলি (আশ্চর্য) সঠিকভাবে কোড করা হয়নি। এটি হ'ল এমন পদ্ধতি রয়েছে যা ইনপুট হিসাবে একক স্ট্রিং আর্গুমেন্ট গ্রহণ করে এবং লক্ষ্য শ্রেণীর একটি উদাহরণ দেয় তবে আপনি যা ভাবেন তা নয় ... পূর্ণসংখ্যা শ্রেণি বিবেচনা করুন:
static Integer getInteger(String nm)
Determines the integer value of the system property with the specified name.
উপরোক্ত পদ্ধতির আদিম কালিগুলিকে মোড়ানো বস্তু হিসাবে পূর্ণসংখ্যার সাথে আসলে কোনও সম্পর্ক নেই। প্রতিচ্ছবিটি ড্রিংড, মান এবং কনস্ট্রাক্টর সদস্যদের থেকে ভুলভাবে স্ট্রিং থেকে পূর্ণসংখ্যার তৈরির সম্ভাব্য প্রার্থী হিসাবে এটি খুঁজে পাবেন - যা বেশিরভাগ স্বেচ্ছাচারী স্ট্রিং রূপান্তরগুলির জন্য উপযুক্ত যেখানে আপনার ইনপুট ডেটার উপরে সত্যই নিয়ন্ত্রণ নেই তবে কেবল চান এটি একটি পূর্ণসংখ্যা সম্ভব কিনা তা জানুন।
উপরের প্রতিকারের জন্য, ব্যতিক্রমগুলি ছুঁড়ে দেওয়ার পদ্ধতিগুলির সন্ধান করা একটি ভাল শুরু কারণ অবৈধ ইনপুট মানগুলি যা এই জাতীয় সামগ্রীর উদাহরণ তৈরি করে তার ব্যতিক্রম ছুঁড়ে ফেলা উচিত । দুর্ভাগ্যক্রমে, বাস্তবায়নগুলি ব্যতিক্রমগুলি চেক হিসাবে ঘোষিত হয়েছে কিনা তা পৃথক রয়েছে। Integer.valueOf (স্ট্রিং) উদাহরণস্বরূপ একটি চেক করা নম্বর ফরমেট এক্সেক্সশনটি ছুড়ে ফেলে তবে প্যাটার্ন ডটকমপিলে () ব্যতিক্রমগুলি প্রতিচ্ছবি অনুসন্ধানের সময় খুঁজে পাওয়া যায় না। আবার এই গতিশীল "ক্রস-কাস্টিং" পদ্ধতির ব্যর্থতা নয়, আমি অবজেক্ট তৈরির পদ্ধতিতে ব্যতিক্রমী ঘোষণার জন্য খুব মানহীন বাস্তবায়ন বলে মনে করি।
যদি কেউ উপরোক্ত কীভাবে প্রয়োগ করা হয়েছে সে সম্পর্কে আরও বিশদ জানতে চান তবে আমাকে জানান তবে আমি মনে করি যে এই সমাধানটি আরও বেশি নমনীয় / এক্সটেনসিবল এবং টাইপ-সুরক্ষার ভাল অংশগুলি না হারিয়ে কম কোড সহ। অবশ্যই "আপনার ডেটা জানা" সর্বদা সেরা তবে আমাদের মধ্যে অনেকেই খুঁজে পান, আমরা মাঝে মাঝে কেবল পরিচালনা না করে নেওয়া সামগ্রী পেয়েছি এবং এটি সঠিকভাবে ব্যবহারের জন্য আমাদের সেরাটি করতে হবে।
চিয়ার্স