জাভা 8 বৈশিষ্ট্য হিসাবে ডিফল্ট পদ্ধতি: নিরাপদ?


116

জাভা 8-র বৈশিষ্ট্যের দরিদ্র লোকের সংস্করণ হিসাবে ডিফল্ট পদ্ধতিগুলি ব্যবহার করা কি নিরাপদ অনুশীলন ?

কেউ কেউ দাবি করেছেন যে আপনি যদি পান্ডাকে কেবল এটির জন্য ব্যবহার করেন তবে এটি শীতল হতে পারে, তবে এটি আমার উদ্দেশ্য নয়। এটি প্রায়শই মনে করিয়ে দেওয়া হয় যে এপিআই বিবর্তন এবং পশ্চাদপটে সামঞ্জস্যতা সমর্থন করার জন্য ডিফল্ট পদ্ধতিগুলি চালু হয়েছিল, যা সত্য, তবে এটি সেগুলিকে বৈশিষ্ট্য হিসাবে ব্যবহার করতে ভুল বা মোচড় দেয় না।

আমি নিম্নলিখিত ব্যবহারিক ব্যবহারের বিষয়টি মাথায় রেখেছি :

public interface Loggable {
    default Logger logger() {
        return LoggerFactory.getLogger(this.getClass());
    }
}

বা সম্ভবত, একটি সংজ্ঞায়িত PeriodTrait:

public interface PeriodeTrait {
    Date getStartDate();
    Date getEndDate();
    default isValid(Date atDate) {
        ...
    }
}

স্বীকৃতিস্বরূপ, রচনাটি ব্যবহার করা যেতে পারে (বা এমনকি সহায়ক শ্রেণিগুলি) তবে এটি আরও ভার্জোজ এবং বিশৃঙ্খলাযুক্ত বলে মনে হয় এবং বহুবর্ষ থেকে উপকার পেতে দেয় না।

সুতরাং, ডিফল্ট পদ্ধতিগুলি মৌলিক বৈশিষ্ট্য হিসাবে ব্যবহার করা কি ঠিক / নিরাপদ , বা আমার অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া সম্পর্কে চিন্তিত হওয়া উচিত?

এসও সম্পর্কিত বেশ কয়েকটি প্রশ্ন জাভা বনাম স্কালা বৈশিষ্ট্যের সাথে সম্পর্কিত; এখানে যে কথা না। আমি নিছক মতামত জিজ্ঞাসা করছি না। পরিবর্তে, আমি একটি প্রামাণিক উত্তর বা কমপক্ষে ক্ষেত্রের অন্তর্দৃষ্টি খুঁজছি: আপনি যদি নিজের কর্পোরেট প্রকল্পের বৈশিষ্ট্য হিসাবে ডিফল্ট পদ্ধতি ব্যবহার করেন তবে এটি কি সময়সাপ হিসাবে পরিণত হয়েছিল?


আমার কাছে মনে হয় যে আপনি একটি বিমূর্ত শ্রেণীর উত্তরাধিকার সূচনা থেকে একই উপকারগুলি পেতে পারেন এবং পান্ডা কান্নাকাটি করার বিষয়ে চিন্তা করার দরকার নেই ... আমি একটি ইন্টারফেসে একটি ডিফল্ট পদ্ধতি ব্যবহার করতে দেখতে পেলাম কেবল কারণটি হল আপনার কার্যকারিতা প্রয়োজন এবং নাও পারেন ইন্টারফেসের ভিত্তিতে লিগ্যাসি কোডের একগুচ্ছ পরিবর্তন করুন।
দেবেন ফিলিপস

1
আমি @ infosec812 এর সাথে একটি বিমূর্ত শ্রেণীর বিস্তৃতি সম্পর্কে একমত যা তার নিজস্ব স্ট্যাটিক লগার ক্ষেত্রটি সংজ্ঞায়িত করে। আপনার লগার () পদ্ধতিটি প্রতিবার যখন কোনও নতুন লগার দৃষ্টিকোণটি ইনস্ট্যান্ট করবে না?
anদান স্পিগেল

লগিংয়ের জন্য, আপনি প্রজেক্টলম্বোক.অর্গ এবং তাদের @ এসএলএফ 4 জোট টিকা দেখতে চাইতে পারেন।
ডেভেন ফিলিপস

উত্তর:


120

সংক্ষিপ্ত উত্তরটি হ'ল: আপনি যদি সেগুলি নিরাপদে ব্যবহার করেন তবে এটি নিরাপদ :)

চটজলদি উত্তর: বৈশিষ্টগুলি দ্বারা আপনি কী বোঝাতে বলুন এবং সম্ভবত আমি আপনাকে আরও একটি ভাল উত্তর দেব :)

সমস্ত গুরুত্বের সাথে, "বৈশিষ্ট্য" শব্দটি সঠিকভাবে সংজ্ঞায়িত হয় না। অনেক জাভা বিকাশকারী স্ক্যালায় প্রকাশিত হওয়ায় বৈশিষ্ট্যগুলির সাথে সর্বাধিক পরিচিত, তবে নাম বা কার্যকরভাবে স্ক্যালাল বৈশিষ্ট্যগুলি প্রথম ভাষা থেকে অনেক দূরে।

উদাহরণস্বরূপ, স্কালায়, বৈশিষ্ট্যগুলি রাষ্ট্রীয় ( 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চ্ছিক পদ্ধতিগুলির মতো প্রায়শই ওভাররাইড করা হয়। ডিফল্ট কী প্রতিশ্রুতি দেয় সে সম্পর্কে আপনাকে পর্যাপ্ত স্পেসিফিকেশন (কেবলমাত্র ডকুমেন্টেশন নয়) সরবরাহ করতে হবে, সুতরাং প্রয়োগকারী তাদের এটিকে ওভাররাইড করতে হবে কিনা সে সম্পর্কে একটি বুদ্ধিমান সিদ্ধান্ত নিতে পারেন।


9
ব্রায়ানকে এই বিস্তৃত উত্তরের জন্য ধন্যবাদ। এখন আমি হালকা হৃদয় দিয়ে ডিফল্ট পদ্ধতিগুলি ব্যবহার করতে পারি। পাঠকগণ: ইন্টারফেস বিবর্তন এবং ডিফল্ট পদ্ধতিগুলির বিষয়ে ব্রায়ান গয়েটসের আরও তথ্য উদাহরণ হিসাবে নাইটহ্যাকিং ওয়ার্ল্ডওয়াইড ল্যাম্বডাসে পাওয়া যাবে ।
youri

ধন্যবাদ @ ব্রায়ান-গেটজ আপনি যা বলেছেন তা থেকে, আমি মনে করি জাওয়ার ডিফল্ট পদ্ধতিগুলি ডুকাস এট আল পেপার ( scg.unibe.ch/archive/papers/Duca06bTOPLASTraits.pdf ) এ সংজ্ঞায়িত traditional তিহ্যবাহী বৈশিষ্ট্যের ধারণার কাছাকাছি । স্কেল "বৈশিষ্ট্যগুলি" মোটেও আমার কাছে বৈশিষ্ট্যের মতো মনে হয় না, যেহেতু তাদের বর্ণনা রয়েছে, তাদের রচনায় রৈখিকতা ব্যবহার করুন এবং এটি প্রদর্শিত হবে যে এগুলি স্পষ্টতই পদ্ধতি বিবাদগুলিকেও সমাধান করে - এবং এগুলি হ'ল প্রথাগত বৈশিষ্ট্যগুলি নয় আছে। আসলে, আমি বলব স্কালাল বৈশিষ্টগুলি বৈশিষ্ট্যের চেয়ে মিক্সিনের মতো। আপনি কি মনে করেন? PS: আমি স্কালায় কখনও কোড করি নি।
অ্যাডিনো

কোনও শ্রোতা হিসাবে কাজ করে এমন একটি ইন্টারফেসে পদ্ধতির জন্য খালি ডিফল্ট প্রয়োগগুলি কীভাবে ব্যবহার করবেন? শ্রোতা বাস্তবায়ন কেবল কয়েকটি ইন্টারফেস পদ্ধতির জন্যই আগ্রহী হতে পারে, সুতরাং পদ্ধতিগুলি ডিফল্ট করে প্রয়োগকারীকে কেবল সেই পদ্ধতিগুলি প্রয়োগ করতে হয় যা এটি শোনা দরকার।
লাহিরু চান্দিমা

1
পছন্দ করেছেন MouseListener? এই এপিআই স্টাইলটি যে পরিমাণে বোঝায়, এটি "alচ্ছিক পদ্ধতিগুলি" বালতির সাথে খাপ খায়। Clearlyচ্ছিক-নেস স্পষ্টভাবে নথিভুক্ত করা নিশ্চিত করুন!
ব্রায়ান গয়েটজ

হ্যাঁ. শুধু হিসেবে MouseListener। উত্তরের জন্য ধন্যবাদ.
লাহিরু চান্দিমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.