সংক্ষিপ্ত উত্তরটি হ'ল: আপনি যদি সেগুলি নিরাপদে ব্যবহার করেন তবে এটি নিরাপদ :)
চটজলদি উত্তর: বৈশিষ্টগুলি দ্বারা আপনি কী বোঝাতে বলুন এবং সম্ভবত আমি আপনাকে আরও একটি ভাল উত্তর দেব :)
সমস্ত গুরুত্বের সাথে, "বৈশিষ্ট্য" শব্দটি সঠিকভাবে সংজ্ঞায়িত হয় না। অনেক জাভা বিকাশকারী স্ক্যালায় প্রকাশিত হওয়ায় বৈশিষ্ট্যগুলির সাথে সর্বাধিক পরিচিত, তবে নাম বা কার্যকরভাবে স্ক্যালাল বৈশিষ্ট্যগুলি প্রথম ভাষা থেকে অনেক দূরে।
উদাহরণস্বরূপ, স্কালায়, বৈশিষ্ট্যগুলি রাষ্ট্রীয় ( var
পরিবর্তনশীল থাকতে পারে ); দুর্গে তারা খাঁটি আচরণ করে। ডিফল্ট পদ্ধতি সহ জাভার ইন্টারফেসগুলি রাষ্ট্রহীন; এর অর্থ কি তারা বৈশিষ্ট্য নয়? (ইঙ্গিত: এটি একটি কৌশল প্রশ্ন)
আবার, স্কালায়, বৈশিষ্ট্যগুলি রৈখিকতার মাধ্যমে রচিত হয়; বর্গ যদি A
বৈশিষ্ট্যগুলো প্রসারিত X
এবং Y
তারপর, যে ক্রমে X
এবং Y
নির্ধারণ করে সংমিশ্রণ হয় কিভাবে দ্বন্দ্বের X
এবং Y
মীমাংসা করা হয়। জাভাতে, এই রৈখিক প্রক্রিয়াটি উপস্থিত নেই (এটি প্রত্যাখাত হয়েছিল, কিছু অংশে, কারণ এটি খুব "আন-জাভা-জাতীয়" ছিল))
ইন্টারফেসে ডিফল্ট পদ্ধতি যুক্ত করার প্রকৃত কারণটি ছিল ইন্টারফেসের বিবর্তনকে সমর্থন করা , তবে আমরা ভালভাবেই জানি যে আমরা এর বাইরে চলে যাচ্ছি। আপনি এটিকে "ইন্টারফেস বিবর্তন ++" বা "বৈশিষ্ট্য--" হিসাবে বিবেচনা করুন না কেন এটি ব্যক্তিগত ব্যাখ্যার বিষয়। সুতরাং, সুরক্ষা সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য ... যতক্ষণ আপনি যান্ত্রিকভাবে এটি সমর্থন করে না এমন কিছুতে ইচ্ছাকৃতভাবে প্রসারিত করার চেষ্টা করার পরিবর্তে প্রক্রিয়াটি যা সমর্থন করে তা স্থির রাখুন, আপনার ভাল হওয়া উচিত।
একটি মূল নকশা লক্ষ্য ছিল একটি ইন্টারফেসের ক্লায়েন্টের দৃষ্টিকোণ থেকে, "নিয়মিত" ইন্টারফেস পদ্ধতি থেকে ডিফল্ট পদ্ধতিগুলি পৃথক পৃথক হতে হবে। কোনও পদ্ধতির ডিফল্ট নেস, সুতরাং ইন্টারফেসের ডিজাইনার এবং প্রয়োগকারীদের জন্য কেবল আকর্ষণীয় ।
ডিজাইনের লক্ষ্যগুলির মধ্যে বেশ কয়েকটি ব্যবহারের ক্ষেত্রে এটি রয়েছে:
ইন্টারফেস বিবর্তন। এখানে, আমরা বিদ্যমান ইন্টারফেসে একটি নতুন পদ্ধতি যুক্ত করছি, যা সেই ইন্টারফেসে বিদ্যমান পদ্ধতির ক্ষেত্রে একটি বুদ্ধিমান ডিফল্ট বাস্তবায়ন রয়েছে। উদাহরণটিতে forEach
পদ্ধতিটি যুক্ত করা হবে Collection
, যেখানে পদ্ধতির ক্ষেত্রে ডিফল্ট বাস্তবায়ন লেখা হয় iterator()
।
""চ্ছিক" পদ্ধতিগুলি। এখানে, একটি ইন্টারফেসের ডিজাইনার বলছেন "প্রয়োগকারীরা যদি কার্যকরীতার ক্ষেত্রে সীমাবদ্ধতার সাথে জড়িত থাকে তবে তারা এই পদ্ধতিটি প্রয়োগ করতে হবে না"। উদাহরণস্বরূপ, Iterator.remove
একটি ডিফল্ট দেওয়া হয়েছিল যা ছোঁড়ে UnsupportedOperationException
; যেহেতু বিপুল সংখ্যাগরিষ্ঠ বাস্তবায়নের Iterator
এই আচরণ রয়েছে, তাই ডিফল্ট এই পদ্ধতিটিকে মূলত optionচ্ছিক করে তোলে। (যদি এর আচরণটি AbstractCollection
ডিফল্ট হিসাবে প্রকাশ করা হত তবে Collection
আমরা মিউটেশন পদ্ধতিতেও এটি করতে পারি))
সুবিধা পদ্ধতি। এগুলি এমন পদ্ধতি যা সুবিধার জন্য কঠোরভাবে আবার ক্লাসে অ-ডিফল্ট পদ্ধতির ক্ষেত্রে কার্যকরভাবে প্রয়োগ করা হয়। logger()
আপনার প্রথম উদাহরণে পদ্ধতি এই একটি যুক্তিসঙ্গত চিত্রণ।
Combinators। এগুলি এমন রচনাগত পদ্ধতি যা বর্তমান উদাহরণের ভিত্তিতে ইন্টারফেসের নতুন উদাহরণ ইনস্ট্যান্ট করে। উদাহরণস্বরূপ, পদ্ধতিগুলি Predicate.and()
বা Comparator.thenComparing()
সংযুক্তকারীগুলির উদাহরণ।
আপনি যদি কোনও ডিফল্ট বাস্তবায়ন সরবরাহ করেন তবে @implSpec
প্রয়োগকারীদের তারা পদ্ধতিটি ওভাররাইড করতে চান কিনা তা বোঝাতে সহায়তা করার জন্য আপনাকে ডিফল্টের ( জেডিকে-তে , আমরা এর জন্য জাভাদক ট্যাগ ব্যবহার করব) কিছু স্পেসিফিকেশনও সরবরাহ করতে হবে। কিছু ডিফল্ট যেমন সুবিধা পদ্ধতি এবং সংযুক্তকারীগুলি প্রায় কখনই ওভাররাইড হয় না; অন্যান্য, methodsচ্ছিক পদ্ধতিগুলির মতো প্রায়শই ওভাররাইড করা হয়। ডিফল্ট কী প্রতিশ্রুতি দেয় সে সম্পর্কে আপনাকে পর্যাপ্ত স্পেসিফিকেশন (কেবলমাত্র ডকুমেন্টেশন নয়) সরবরাহ করতে হবে, সুতরাং প্রয়োগকারী তাদের এটিকে ওভাররাইড করতে হবে কিনা সে সম্পর্কে একটি বুদ্ধিমান সিদ্ধান্ত নিতে পারেন।