জাভা ইন্টারফেসে .চ্ছিক পদ্ধতি


120

আমার বোধগম্যতা থেকে আপনি যদি জাভাতে কোনও ইন্টারফেস প্রয়োগ করেন, সেই ইন্টারফেসে নির্দিষ্ট পদ্ধতিগুলি উল্লিখিত ইন্টারফেসটি প্রয়োগ করে সাব ক্লাসগুলি ব্যবহার করতে হবে।

আমি লক্ষ্য করেছি যে সংগ্রহ ইন্টারফেসের মতো কিছু ইন্টারফেসে এমন পদ্ধতি রয়েছে যা alচ্ছিক হিসাবে মন্তব্য করা হয়েছে, তবে এর অর্থ কী? এটি আমাকে কিছুটা ছুঁড়ে দিয়েছে কারণ আমি ভেবেছিলাম ইন্টারফেসে নির্দিষ্ট সমস্ত পদ্ধতির প্রয়োজন হবে?


আপনি কোন পদ্ধতিগুলি উল্লেখ করছেন? আমি এটি
জাভাডক


উত্তর:


232

এখানে উত্তরগুলিতে একটি ভয়ঙ্কর বিভ্রান্তি রয়েছে বলে মনে হচ্ছে।

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

এটি উপলব্ধি করা গুরুত্বপূর্ণ যে ইন্টারফেসের সাথে মানিয়ে নেওয়ার জন্য দুটি স্তর রয়েছে:

  1. জাভা ভাষা যা যাচাই করতে পারে। এটি বেশ সবেমাত্র ফুটে উঠেছে: প্রতিটি পদ্ধতির জন্য কিছু বাস্তবায়ন আছে কি?

  2. আসলে চুক্তি পূরণ হচ্ছে fulf এটি হ'ল, বাস্তবায়ন ইন্টারফেসের ডকুমেন্টেশনগুলির যা করা উচিত তা করে?

    ভাল লিখিত ইন্টারফেস বাস্তবায়ন থেকে প্রত্যাশা করা হয় ঠিক কি ব্যাখ্যা ডকুমেন্টেশন অন্তর্ভুক্ত করা হবে। আপনার সংকলকটি এটি আপনার জন্য পরীক্ষা করতে পারে না। আপনাকে ডক্সটি পড়তে হবে এবং তারা যা বলে তা করা উচিত। যদি আপনি চুক্তিটি বলে যা না করেন তা না করেন তবে সংকলকের হিসাবে আপনার ইন্টারফেসটি কার্যকর হবে তবে এটি একটি ত্রুটিযুক্ত / অবৈধ বাস্তবায়ন হবে।

সংগ্রহের এপিআই ডিজাইন করার সময় জোশুয়া ব্লচ সিদ্ধান্ত নিয়েছিলেন যে সংগ্রহের বিভিন্ন রূপের (যেমন: পাঠযোগ্য, লিখনযোগ্য, এলোমেলো অ্যাক্সেস ইত্যাদি) মধ্যে পার্থক্য করার জন্য খুব সূক্ষ্ম-ইন্টার্ন ইন্টারফেসের পরিবর্তে তাঁর কেবলমাত্র খুব মোটা ইন্টারফেস রয়েছে, প্রাথমিকভাবে Collection, List, Setএবং Map, এবং তারপর হিসাবে "ঐচ্ছিক" নির্দিষ্ট অপারেশন উল্লেখ করা হয়েছে। এটি মিলে বিস্ফোরণ এড়ানোর জন্য হয়েছিল যা সূক্ষ্ম দানযুক্ত ইন্টারফেসের ফলে ঘটে। থেকে জাভা সংগ্রহগুলি এপিআই ডিজাইন প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী :

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

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

লগগুলি বিবেচনা করুন (যেমন ত্রুটিযুক্ত লগগুলি, পুনরুদ্ধারযোগ্য ডেটা অবজেক্টগুলির জন্য নিরীক্ষণ লগ এবং জার্নাল)। এগুলি প্রাকৃতিক অ্যাপেন্ড-কেবল ক্রম, যা অপসারণ এবং সেট (প্রতিস্থাপন) ব্যতীত সমস্ত তালিকার ক্রিয়াকলাপ সমর্থন করে। তাদের জন্য একটি নতুন কোর ইন্টারফেস এবং একটি নতুন পুনরাবৃত্তি প্রয়োজন।

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

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

যখন সমস্ত বলা হয়েছিল এবং হয়ে গেল, আমরা অনুভব করেছি যে এটি একটি খুব ছোট কোর ইন্টারফেসের একটি ছোট সেট সরবরাহ করে পুরো সময়টিকে পাশ কাটাতে একটি শব্দ ইঞ্জিনিয়ারিং সমঝোতা যা রানটাইম ব্যতিক্রম ছুঁড়ে ফেলতে পারে।

সংগ্রহের এপিআই-তে পদ্ধতিগুলি যখন "alচ্ছিক অপারেশন" হিসাবে নথিভুক্ত করা হয়, এর অর্থ এই নয় যে আপনি কেবল প্রয়োগটি প্রয়োগের ক্ষেত্রে ছেড়ে যেতে পারেন, বা এর অর্থ এই নয় যে আপনি একটি খালি পদ্ধতির বডি ব্যবহার করতে পারেন (একটির জন্য, অনেকগুলি তাদের একটি ফলাফল ফিরে আসতে হবে)। বরং এর মানে হল যে একটি বৈধ বাস্তবায়ন পছন্দ (এক এখনও চুক্তি কে কনর্ফাম করে) একটি নিক্ষেপ করা হয় UnsupportedOperationException

নোট করুন যেহেতু UnsupportedOperationExceptionএটি হ'ল RuntimeExceptionআপনি যেকোন পদ্ধতি বাস্তবায়ন থেকে এটিকে ছুঁড়ে ফেলতে পারেন, যতক্ষণ না সংকলকটি সম্পর্কিত। উদাহরণস্বরূপ, আপনি এটি প্রয়োগ থেকে ফেলে দিতে পারেন Collection.size()। তবে, এই জাতীয় বাস্তবায়ন চুক্তি লঙ্ঘন করবে কারণ নথির জন্য ডকুমেন্টেশন Collection.size()এটি অনুমোদিত নয় বলে জানায়।

একদিকে: জাভার কালেকশন এপিআই দ্বারা ব্যবহৃত পদ্ধতির বিষয়টি কিছুটা বিতর্কিত (যদিও এটি প্রথম প্রবর্তন করা হয়েছিল তার চেয়ে কম এখন)। নিখুঁত বিশ্বে ইন্টারফেসে optionচ্ছিক অপারেশন হবে না এবং পরিবর্তে সূক্ষ্ম দানযুক্ত ইন্টারফেস ব্যবহার করা হবে। সমস্যাটি হ'ল জাভা কোনও অনুমানকৃত কাঠামোগত প্রকার বা ছেদবদ্ধতার প্রকারকেই সমর্থন করে না, এজন্য সংগ্রহের ক্ষেত্রে "সঠিক উপায়ে" জিনিসগুলি করার চেষ্টা শেষ পর্যন্ত অত্যন্ত অনর্থক হয়ে যায়।


30
+1 এর জন্য There are no exceptions to this rule। কেন এই উত্তর গৃহীত হিসাবে চিহ্নিত করা হচ্ছে না তা ভাবছেন। অন্যরা ভাল তবে আপনি যথেষ্ট পরিমাণে দিয়েছেন।
xyz

9
"জাভা ভাষার প্রয়োজন যে ইন্টারফেসের প্রতিটি পদ্ধতি সেই ইন্টারফেসের প্রতিটি প্রয়োগের মাধ্যমে প্রয়োগ করা হয় Per সময়কাল this এই নিয়মের ব্যতিক্রম নেই" " ব্যতীত ... যখন আছে। :-) জাভা 8 ইন্টারফেস একটি ডিফল্ট পদ্ধতি বাস্তবায়ন নির্দিষ্ট করতে পারে, সুতরাং জাভা 8 এ ... এটি সত্য নয় যে কোনও ইন্টারফেসের প্রতিটি পদ্ধতি অবশ্যই ইন্টারফেসের প্রতিটি প্রয়োগের দ্বারা প্রয়োগ করা উচিত, কমপক্ষে আপনাকে অবশ্যই এই অর্থে নয় যে আপনার অবশ্যই কংক্রিট শ্রেণিতে বাস্তবায়ন কোড।
দাবলিক

1
@ ড্যাব্লিক যখন আমি বলেছিলেন "প্রতিটি বাস্তবায়ন দ্বারা প্রয়োগ করা হয়" আমি এর অর্থ এই ছিল না যে পদ্ধতি প্রয়োগকরণ অবশ্যই বাস্তবায়নকারী শ্রেণীর উত্সে থাকতে হবে। এমনকি জাভা 8 এর পূর্বে, কেউ একটি ইন্টারফেস পদ্ধতির প্রয়োগের উত্তরাধিকারী হতে পারে, এমনকী এমন কোনও শ্রেণি থেকেও যা ইন্টারফেসটি বলেছিল না। যেমন: তৈরি করুন Fooযা Runnableজনসাধারণের পদ্ধতিতে কার্যকর হয় না void run()। এখন একটি বর্গ তৈরি Barযে extends Fooএবং implements Runnableoveriding ছাড়া run। এটি এখনও অপ্রত্যক্ষভাবে হলেও পদ্ধতিটি প্রয়োগ করে। তেমনি, একটি ডিফল্ট পদ্ধতি বাস্তবায়ন এখনও একটি বাস্তবায়ন।
লরেন্স গনসাল্ভেস

দুঃক্ষিত। মূলত পোষ্টের সাথে প্রাসঙ্গিক হতে পারে এমন কোনও জাভা 8 বৈশিষ্ট্যের দিকে দৃষ্টি আকর্ষণ করার জন্য আমি প্যাডেন্টিকভাবে এতটা সমালোচিত হওয়ার চেষ্টা করছিলাম না। জাভা 8-এ, আপনার কাছে এখন এমন বাস্তবায়ন রয়েছে যা কোনও সুপার-ক্লাস বা সাবক্লাসে কোডড নয়। এটি (আইএমএইচও) নকশার নিদর্শনগুলির একটি নতুন জগত উন্মুক্ত করে যা কিছু ক্ষেত্রে উপযুক্ত হতে পারে যেখানে একাধিক-উত্তরাধিকারের উপর নিষেধাজ্ঞায় কিছু চ্যালেঞ্জ উপস্থিত হয়েছিল। আমি মনে করি এটি অত্যন্ত দরকারী ডিজাইনের নিদর্শনগুলির একটি নতুন সেট তৈরি করবে \
ডাব্লিক

3
@ অ্যান্ড্রুএস কারণ জাভা 8 removeএ একটি ডিফল্ট বাস্তবায়ন দেওয়া হয়েছিল। আপনি যদি এটি বাস্তবায়ন করেন না, তবে আপনার ক্লাসটি ডিফল্ট বাস্তবায়ন পায়। আপনি উল্লেখ করেছেন যে দুটি অন্যান্য পদ্ধতির ডিফল্ট বাস্তবায়ন নেই।
লরেন্স গনসাল্ভেস

27

একটি ইন্টারফেসের জন্য একটি বাস্তবায়নকারী (অবিমূর্ত) শ্রেণি সংকলন করতে - সমস্ত পদ্ধতি প্রয়োগ করা আবশ্যক।

তবে , যদি আমরা কোনও পদ্ধতির কথা ভাবি যে এর প্রয়োগকরণটি একটি 'অ-বাস্তবায়িত' ( Collectionইন্টারফেসের কিছু পদ্ধতির মতো ) Collectionহিসাবে সাধারণ ব্যতিক্রম হয় তবে এই ক্ষেত্রে ইন্টারফেসটি ব্যতিক্রম, নিয়মিত ক্ষেত্রে নয়। সাধারণত , প্রয়োগকারী শ্রেণীর সমস্ত পদ্ধতি প্রয়োগ করা উচিত (এবং হবে)।

সংগ্রহের "alচ্ছিক" অর্থ হ'ল বাস্তবায়নকারী শ্রেণিকে এটি 'প্রয়োগ' করতে হবে না (উপরের পরিভাষা অনুযায়ী), এবং এটি কেবল ছুঁড়ে ফেলবে NotSupportedException)।

একটি ভাল উদাহরণ- add()অপরিবর্তনীয় সংগ্রহের জন্য পদ্ধতি - কংক্রিট কেবল এমন একটি পদ্ধতি বাস্তবায়ন করবে যা ছোঁড়া ছাড়া কিছুই করে নাNotSupportedException

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


হালনাগাদ:

জাভা 8 হিসাবে, একটি ডিফল্ট পদ্ধতি চালু করা হয়েছিল।

তার অর্থ, একটি ইন্টারফেস একটি পদ্ধতি নির্ধারণ করতে পারে - এর বাস্তবায়ন সহ।
ইন্টারফেসগুলিতে কার্যকারিতা যুক্ত করার জন্য এটি যুক্ত করা হয়েছিল, তবুও কোডের টুকরাগুলির জন্য পশ্চাদপটে সামঞ্জস্যতা সমর্থন করার জন্য যা নতুন কার্যকারিতার প্রয়োজন হয় না।

নোট করুন যে পদ্ধতিটি এখনও ঘোষণা করে এমন সমস্ত শ্রেণীর দ্বারা প্রয়োগ করা হয়েছে, তবে ইন্টারফেসের সংজ্ঞা ব্যবহার করে।


"গণ্ডগোল না করা" এর পরিবর্তে, আমি মনে করি এটি "এটি ঠিক কেমন" এর চেয়ে বেশি more

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

12
"এটি বাস্তবায়ন করতে হবে না (এটি সম্ভবত কেবল এমন একটি পদ্ধতি তৈরি করবে যা ছুড়ে দেয় ...)"। যে হয় পদ্ধতি বাস্তবায়ন।
লার্নের মারকুইস

1
যেহেতু এটি দুর্ভাগ্যক্রমে গ্রহণযোগ্য উত্তর হয়ে গেছে, তাই আমি এটি পুনরায় লেখার পরামর্শ দেব। ইজেপি ইতিমধ্যে নির্দেশিত হিসাবে ' সাধারণত , প্রয়োগকারী শ্রেণীর সমস্ত পদ্ধতি প্রয়োগ করা উচিত (এবং হবে)' বিভ্রান্তিকর ।
আলবার্তো

2
। "ঐচ্ছিক" সংগ্রহ মানে যে বাস্তবায়নের বর্গ তা বাস্তবায়ন হবে তা নয় "- এই সমভূমি মিথ্যা কসম।" আপনি অন্য গড় কিছু বাস্তবায়ন "নেই।
djechlin

19

জাভাতে একটি ইন্টারফেস কেবল ক্লাস বাস্তবায়নের জন্য চুক্তি ঘোষণা করে। সেই ইন্টারফেসের সমস্ত পদ্ধতি অবশ্যই প্রয়োগ করা উচিত , তবে বাস্তবায়নকারী ক্লাসগুলি তাদের নিরপেক্ষ, যেমন ফাঁকা ছেড়ে দিতে পারে। স্বীকৃত উদাহরণ হিসাবে,

interface Foo {
  void doSomething();
  void doSomethingElse();
}

class MyClass implements Foo {
  public void doSomething() {
     /* All of my code goes here */
  }

  public void doSomethingElse() {
    // I leave this unimplemented
  }
}

doSomethingElse()আমার সাবক্লাসগুলি বাস্তবায়নের জন্য এটি বিনামূল্যে রেখে এখন আমি অযৌক্তিকভাবে ছেড়েছি । এটি alচ্ছিক।

class SubClass extends MyClass {
    @Override
    public void doSomethingElse() {
      // Here's my implementation. 
    }
}

তবে, আপনি যদি কালেকশন ইন্টারফেসের বিষয়ে কথা বলছেন, যেমন অন্যরা বলেছেন, সেগুলি ব্যতিক্রম। নির্দিষ্ট কিছু পদ্ধতি যদি প্রয়োগ না করা হয় এবং আপনি সেগুলি কল করেন তবে সেগুলি UnsupportedOperationExceptionব্যতিক্রম ছুঁড়ে দিতে পারে ।


আমি তোমাকে আমার বন্ধুকে চুমুতে পারি।
মাইক্রো

16

সংগ্রহ ইন্টারফেসের alচ্ছিক পদ্ধতিগুলির অর্থ হল যে পদ্ধতির প্রয়োগটি একটি ব্যতিক্রম ছুঁড়ে দেওয়ার অনুমতি দেয় তবে এটি যেভাবেই বাস্তবায়ন করতে হবে। দস্তাবেজে বর্ণিত হিসাবে :

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


জাভাডোকগুলি alচ্ছিক বলতে কী বোঝায় তা আমি সত্যিই বুঝতে পারি নি। আমি বিশ্বাস করি আপনি যেমন বলেছিলেন সেগুলিই তাদের বোঝানো হয়েছিল। কিন্তু পদ্ধতি মান দ্বারা ঐচ্ছিক: new Runnable ( ) { @ Override public void run ( ) { throw new UnsupportedOperationException ( ) ; } };
এমোরি

এই ক্ষেত্রে প্রযোজ্য বলে মনে হচ্ছে না করা হয় ঐচ্ছিক পদ্ধতি , বরং উদাহরণস্বরূপ, যে, add((T)null)এক ক্ষেত্রে কিন্তু বৈধ হতে পারে না অন্য। এটি, এটি alচ্ছিক ব্যতিক্রম / আচরণ এবং আর্গুমেন্টগুলির জন্য ("উপাদানগুলির উপর বিধিনিষেধ" ... "অযোগ্য উপাদান" ... "ব্যতিক্রমী হিসাবে চিহ্নিত বিকল্পগুলি") এবং al চ্ছিক পদ্ধতিগুলিকে সম্বোধন করে না ।

9

কোডটি সংকলনের জন্য সমস্ত পদ্ধতি বাস্তবায়িত করতে হবে ( defaultজাভা 8+-এ বাস্তবায়নকারীদের বাদে ), তবে বাস্তবায়ন কার্যকরভাবে কার্যকর করার মতো কিছু করতে হবে না। বিশেষত:

  • ফাঁকা হতে পারে (একটি খালি পদ্ধতি।)
  • কেবল একটি UnsupportedOperationException(বা অনুরূপ) নিক্ষেপ করতে পারে

পরবর্তী পদ্ধতির প্রায়শই সংগ্রহের ক্লাসে নেওয়া হয় - সমস্ত পদ্ধতি এখনও প্রয়োগ করা হয়, তবে রানটাইম বললে কিছু ব্যতিক্রম করতে পারে।


5

আসলে, আমি সারফেসভিউ.ক্যালব্যাক 2 দ্বারা অনুপ্রাণিত। আমি মনে করি এটি সরকারী উপায়

public class Foo {
    public interface Callback {
        public void requiredMethod1();
        public void requiredMethod2();
    }

    public interface CallbackExtended extends Callback {
        public void optionalMethod1();
        public void optionalMethod2();
    }

    private Callback mCallback;
}

যদি আপনার শ্রেণিকে alচ্ছিক পদ্ধতিগুলি প্রয়োগ করার প্রয়োজন না হয় তবে কেবল "কলব্যাক প্রয়োগ করে"। যদি আপনার শ্রেণিকে alচ্ছিক পদ্ধতিগুলি প্রয়োগ করতে হয় তবে কেবল "কলব্যাকড এক্সটেন্ডেড প্রয়োগ করে"।

বিষ্ঠা ইংরেজির জন্য দুঃখিত।


5

জাভা 8 এবং তারপরেও, এই প্রশ্নের উত্তরটি এখনও বৈধ তবে এখন আরও সংবেদনশীল।

প্রথমত, গৃহীত উত্তর থেকে এই বিবৃতিগুলি সঠিক থাকে:

  • ইন্টারফেসগুলি বোঝানো হয় তাদের চুক্তিযুক্ত অন্তর্নিহিত আচরণগুলি নির্দিষ্ট করা (আচরণের নিয়মের একটি বিবৃতি যা প্রয়োগকারী ক্লাসগুলিকে বৈধ হিসাবে বিবেচনা করার জন্য মেনে চলতে হবে)
  • চুক্তি (বিধি) এবং বাস্তবায়ন (নিয়মের প্রোগ্রামিক কোডিং) এর মধ্যে পার্থক্য রয়েছে
  • ইন্টারফেসে নির্দিষ্ট পদ্ধতিগুলি সবসময় কার্যকর করা উচিত (কোনও কোনও সময়ে)

সুতরাং, জাভা 8 এ নতুন যে উপদ্রবটি নতুন? "Alচ্ছিক পদ্ধতি" বলতে গেলে নিম্নলিখিত যে কোনও একটি এখন উপযুক্ত pt

1. একটি পদ্ধতি যার বাস্তবায়ন চুক্তিগতভাবে alচ্ছিক

"তৃতীয় বিবৃতি" বলছে যে বিমূর্ত ইন্টারফেস পদ্ধতি সর্বদা প্রয়োগ করা উচিত এবং এটি জাভা 8+-এ সত্যই থেকে যায়। তবে জাভা সংগ্রহ ফ্রেমওয়ার্কের মতো চুক্তিতে কিছু বিমূর্ত ইন্টারফেস পদ্ধতি "বৈকল্পিক" হিসাবে বর্ণনা করা সম্ভব।

এই ক্ষেত্রে, লেখক যিনি ইন্টারফেসটি বাস্তবায়ন করছেন সে পদ্ধতিটি প্রয়োগ না করার জন্য বেছে নিতে পারেন। সংকলক একটি বাস্তবায়নের উপর জোর দেবে, তবে, লেখক এই কোডটি কোনও বিশেষায়িত পদ্ধতির জন্য প্রয়োজন নেই যা নির্দিষ্ট প্রয়োগকারী শ্রেণিতে প্রয়োজন হয় না:

public SomeReturnType optionalInterfaceMethodA(...) {
    throw new UnsupportedOperationException();
}

জাভা 7 এবং তার আগে, এটি ছিল কেবলমাত্র একমাত্র "alচ্ছিক পদ্ধতি" যা ছিল সেখানে, অর্থাত্ একটি পদ্ধতি যা বাস্তবায়ন না করা হলে একটি অসমর্থিত অপারেশন এক্সেক্সশন ফেলে দেয়। এই আচরণটি অগত্যা ইন্টারফেস চুক্তি দ্বারা নির্দিষ্ট করা হয় (যেমন জাভা সংগ্রহ ফ্রেমওয়ার্কের interfaceচ্ছিক ইন্টারফেস পদ্ধতি)।

২. একটি ডিফল্ট পদ্ধতি যার পুনরায় বাস্তবায়ন isচ্ছিক

জাভা 8 ডিফল্ট পদ্ধতিগুলির ধারণা চালু করেছিল । এগুলি এমন পদ্ধতি যাগুলির বাস্তবায়ন হতে পারে এবং ইন্টারফেস সংজ্ঞা নিজেই সরবরাহ করে। সাধারণত কেবল তখনই ডিফল্ট পদ্ধতি সরবরাহ করা সম্ভব হয় যখন মেথড বডিটি অন্যান্য ইন্টারফেসের পদ্ধতি ব্যবহার করে (যেমন, "আদিম") রচনা করা যায় এবং কখন this"এই বস্তু যার শ্রেণিটি এই ইন্টারফেসটি প্রয়োগ করেছে।"

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

এই নতুন পরিবেশে, জাভা সংগ্রহ ফ্রেমওয়ার্কটি আবার লিখে দেওয়া যেতে পারে :

public interface List<E> {
    :
    :
    default public boolean add(E element) {
        throw new UnsupportedOperationException();
    }
    :
    :
}

এই পদ্ধতিতে, "alচ্ছিক" পদ্ধতির add()একটি অসমর্থিত অফার এক্সেক্সশন নিক্ষেপ করার ডিফল্ট আচরণ রয়েছে যদি বাস্তবায়নকারী শ্রেণি তার নিজস্ব কোনও নতুন আচরণ প্রদান করে না, যা হ'ল আপনি যা করতে চান তা হ'ল এবং যা তালিকার চুক্তির সাথে সম্মতিযুক্ত। কোনও লেখক যদি এমন একটি ক্লাস লিখছেন যা তালিকার প্রয়োগে নতুন উপাদান যুক্ত করার অনুমতি দেয় না, তবে এর বাস্তবায়ন add()alচ্ছিক কারণ ডিফল্ট আচরণটি ঠিক যা প্রয়োজন তা হ'ল।

এই ক্ষেত্রে, উপরে "তৃতীয় বিবৃতি" এখনও সত্য ধরে রেখেছে, কারণ পদ্ধতিটি ইন্টারফেসে নিজেই প্রয়োগ করা হয়েছে।

৩. একটি পদ্ধতি যা Optionalফলাফল দেয়

চূড়ান্ত নতুন ধরণের alচ্ছিক পদ্ধতিটি কেবল একটি পদ্ধতি যা একটি ফেরত দেয় OptionalOptionalশ্রেণী সাথে ডিল করার একটি নিশ্চিতভাবে আরো অবজেক্ট ওরিয়েন্টেড উপায় প্রদান করে nullফলাফল নেই।

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


4

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

public boolean  add(E e) {

        throw new UnsupportedOperationException();
    } 

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


4

ঠিক আছে, এই বিষয়টিতে ... হ্যাঁ .. এটি যুক্ত করা হয়েছে তবে ভাবেন, একটি উত্তর অনুপস্থিত। আমি ইন্টারফেসের "ডিফল্ট পদ্ধতি" সম্পর্কে কথা বলছি। উদাহরণস্বরূপ, আসুন কল্পনা করুন যে কোনও কিছু বন্ধ করার জন্য আপনার কাছে একটি ক্লাস থাকবে (যেমন কোনও ডেস্ট্রাক্টর বা অন্য কিছু)। ধরা যাক এর 3 টি পদ্ধতি থাকা উচিত। আসুন তাদের "ডো ফার্স্ট ()", "ডোলস্ট ()" এবং "অনক্লোজ ()" বলি।

সুতরাং আমরা বলি যে আমরা সেই ধরণের যে কোনও বস্তু কমপক্ষে "অনক্লোজ ()" উপলব্ধি করতে চাই, তবে অন্যটি otherচ্ছিক।

ইন্টারফেসের "ডিফল্ট পদ্ধতি" ব্যবহার করে তা বুঝতে পারবেন। আমি জানি, এটি বেশিরভাগ সময় কোনও ইন্টারফেসের কারণটিকে উপেক্ষা করবে তবে আপনি যদি কোনও কাঠামো ডিজাইন করেন তবে এটি কার্যকর হতে পারে।

সুতরাং আপনি যদি এইভাবে এটি উপলব্ধি করতে চান তবে এটি নিম্নলিখিতটি দেখায়

public interface Closer {
    default void doFirst() {
        System.out.print("first ... ");
    }
    void onClose();
    default void doLast() {
        System.out.println("and finally!");
    }
}

এখন কী ঘটবে, যদি আপনি উদাহরণস্বরূপ এটি "টেস্ট" নামক শ্রেণিতে প্রয়োগ করেন তবে সংকলক নিম্নলিখিতগুলির সাথে পুরোপুরি সূক্ষ্ম হবে:

public class TestCloser implements Closer {
    @Override
    public void onClose() {
        System.out.print("closing ... ");
    }
}

আউটপুট সহ:

first ... closing ... and finally!

অথবা

public class TestCloser implements Closer {
    @Override
    public void onClose() {
        System.out.print("closing ... ");
    }

    @Override
    public void doLast() {
        System.out.println("done!");
    }
}

আউটপুট সহ:

first ... closing ... done!

সমস্ত সমন্বয় সম্ভব। "ডিফল্ট" সহ যে কোনও কিছুই প্রয়োগ করা যেতে পারে, তবে তা অবশ্যই করা উচিত নয়, তবে কিছু না থাকলে অবশ্যই প্রয়োগ করা উচিত।

আশা করি এটি পুরোপুরি ভুল নয় যে আমি এখনই উত্তর দিয়েছি।

একটি মহান দিন সবাই আছে!

[edit1]: দয়া করে নোট করুন: এটি কেবল জাভা 8 তে কাজ করে।


হ্যাঁ, দুঃখিত, আমি এটি উল্লেখ করতে ভুলে গিয়েছিলাম ... এখনই সম্পাদনা করা উচিত।
থর্বেন কাক

1

আমি কল ব্যাক ইন্টারফেসটি বাস্তবায়নের জন্য একটি উপায় খুঁজছিলাম, সুতরাং প্রতিটি কল ব্যাকের জন্য প্রতিটি পদ্ধতি প্রয়োগ করতে চাই না বলে optionচ্ছিক পদ্ধতিগুলি প্রয়োগ করা প্রয়োজনীয় ছিল।

সুতরাং, কোনও ইন্টারফেস ব্যবহারের পরিবর্তে, আমি খালি প্রয়োগের সাথে একটি ক্লাস ব্যবহার করেছি যেমন:

public class MyCallBack{
    public void didResponseCameBack(String response){}
}

এবং আপনি এইভাবে সদস্য পরিবর্তনশীল কলব্যাক সেট করতে পারেন,

c.setCallBack(new MyCallBack() {
    public void didResponseCameBack(String response) {
        //your implementation here
    }
});

তারপরে এটিকে কল করুন।

if(mMyCallBack != null) {
    mMyCallBack.didResponseCameBack(response);
}

এইভাবে, কল প্রতি পিছু প্রতিটি পদ্ধতি বাস্তবায়নের বিষয়ে আপনার চিন্তা করার দরকার নেই, তবে কেবল আপনার প্রয়োজন অনুযায়ী ওভাররাইড করুন।


0

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


0

ওরাকলের জাভা সংগ্রহের টিউটোরিয়াল:

মূল সংগ্রহ ইন্টারফেসের সংখ্যা পরিচালনাযোগ্য রাখতে, জাভা প্ল্যাটফর্ম প্রতিটি সংগ্রহের ধরণের প্রতিটি বৈকল্পিকের জন্য পৃথক ইন্টারফেস সরবরাহ করে না। (এই ধরণের রূপগুলি অপরিবর্তনীয়, স্থির-আকার এবং কেবলমাত্র পরিশিষ্টের অন্তর্ভুক্ত থাকতে পারে)) পরিবর্তে, প্রতিটি ইন্টারফেসের পরিবর্তন ক্রিয়াকলাপগুলি alচ্ছিকভাবে মনোনীত করা হয় - প্রদত্ত বাস্তবায়ন সমস্ত ক্রিয়াকলাপ সমর্থন না করার জন্য নির্বাচন করতে পারে। একটি অসমর্থিত অপারেশন প্রার্থনা করা হয়, তাহলে একটি সংগ্রহ একটি ছোঁড়ার UnsupportedOperationException । বাস্তবায়নগুলি তারা কোনটি alচ্ছিক অপারেশন সমর্থন করে তা ডকুমেন্ট করার জন্য দায়ী। জাভা প্ল্যাটফর্মের সমস্ত সাধারণ-উদ্দেশ্য বাস্তবায়ন সমস্ত optionচ্ছিক ক্রিয়াকলাপ সমর্থন করে।

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