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


14

জাভা 8 দিয়ে শুরু defaultকরে ইন্টারফেসে পদ্ধতিগুলি চালু করা হয়েছিল। কার্যকরীভাবে, এর মানে নয় সমস্ত পদ্ধতি interfaceআছে abstract

জাভা 9 (সম্ভবত) দিয়ে শুরু করে, privateপদ্ধতির অনুমতি দেওয়া হবে। এই উপায়ে নয় সমস্ত পদ্ধতি interfaceআছে public abstract

প্রশ্ন "জাভা ইন্টারফেসে পদ্ধতিগুলি publicঅ্যাক্সেস মডিফায়ারের সাথে বা ছাড়াই ঘোষণা করা উচিত ?" স্ট্যাক ওভারফ্লোতে /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m এ জিজ্ঞাসা করা হয়েছিল

সেখানে, বেশিরভাগ উত্তর যুক্তি দিয়েছিল যে public abstractব্যবহার করা উচিত নয় কারণ একটি পদ্ধতিতে কোনও পদ্ধতি interfaceছাড়া আর কিছু হতে পারে না public abstract। এখন আর তা হয় না।

সুতরাং, ইন্টারফেসগুলির এই নতুন বৈশিষ্ট্যগুলির আলোকে, public abstractজাভা ইন্টারফেস পদ্ধতি ঘোষণায় কীওয়ার্ডগুলি ব্যবহার করা উচিত ?

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


5
আপনি জাভা 8 জেএলএস পরীক্ষা করেছেন? পুরাতন স্বীকৃত উত্তরের মতো এসও-তে একই বিভাগ থেকেই বোঝা যায় যে ডিফল্ট পদ্ধতিগুলির প্রবর্তন পূর্ববর্তী সুপারিশের পরিবর্তিত হয়নি যা একই অপ্রয়োজনীয় বিবেচনার ভিত্তিতে ছিল: "কোনও defaultসংশোধনকারী বা সংশোধক না থাকা একটি ইন্টারফেস পদ্ধতিটি staticস্পষ্টতই অনুমোদিত abstract... তবে অনুমোদিত শৈলীর বিষয় হিসাবে নিরুৎসাহিত করা, এ abstractজাতীয় পদ্ধতিতে ঘোষণার জন্য রিডউন্ডলি মডিফায়ার নির্দিষ্ট করতে "। কেন আপনি আশা করেন যে জিনিসগুলি পরিবর্তিত হওয়া উচিত?
gnat

3
আমি ভেবেছিলাম বিষয়গুলি পরিবর্তিত হতে পারে কারণ কোনও পদ্ধতির স্পষ্টতই শর্তটি abstractক্রমশ সংশ্লেষিত হয়ে উঠছে। জাভা 9-তে, একই বাক্যটি হতে পারে, "একটি ইন্টারফেস পদ্ধতিতে কোনও defaultসংশোধক বা একটি staticসংশোধক বা একটি privateসংশোধক নেই যা স্পষ্টভাবে বিমূর্ত হয় ..." অতিরিক্তভাবে, কীওয়ার্ডগুলি স্পষ্টভাবে ব্যবহার না করার জন্য সহায়ক তর্কগুলি যথা, সমস্ত ইন্টারফেস পদ্ধতি হ'ল public abstract, এখন মোট।
ডেভিড ক্যাম্পবেল

টিবিএইচ "ডিফল্ট" পদ্ধতির পিছনে যুক্তি আমি বুঝতে পারি না, এমনকি স্থিতিশীল পদ্ধতিগুলি সাধারণত ইন্টারফেসগুলি কী করতে চায় তা ছাড়িয়ে যায়। ইন্টারফেসগুলি দৃre়তার সাথে স্যাডেল হওয়ার কথা নয়। সে কারণেই তারা উল্লেখের জন্য দরকারী ধরণের।
ট্রিক্সি ওল্ফ

1
@ ট্রিক্সিওল্ফের ডিফল্ট পদ্ধতি ইন্টারফেসগুলিকে বিকশিত করার অনুমতি দেয়। পূর্বে, এবং শ্রেণীর বিপরীতে, একটি পদ্ধতি যুক্ত করা প্রতিটি বাস্তবায়নকে ভেঙে ফেলত; এখন, আপনি যতক্ষণ না আপনার ভাল প্রার্থী ডিফল্ট থাকবেন ততক্ষণ আপনি একটি ইন্টারফেস বাড়তে পারেন। বা যোগ streamকরার বিষয়টি বিবেচনা করুন । বিকল্পটি হ'ল একটি নতুন সাব-ইন্টারফেস তৈরি করা এবং গ্রাফিক্স 2 ডি এর মতো সবাইকে হতাশায় নিয়ে আসা, এবং কেউ তা উপভোগ করেনি! java.util.CollectionMap.getOrDefault()
সুসানডাব

উত্তর:


2

স্ট্যাকওভারফ্লো উত্তরে প্রসারিত করতে:

  1. publicএক্সেস পরিবর্তক কারণ প্রয়োজন নেই

    একটি ইন্টারফেসের মূল অংশে প্রতিটি পদ্ধতির ঘোষণা সুস্পষ্টভাবে প্রকাশ্য (§§.))। একটি ইন্টারফেসে একটি পদ্ধতি ঘোষণার জন্য জনসাধারণের সংশোধনকারীকে অতিরিক্তভাবে নির্দিষ্ট করার জন্য এটি অনুমোদিত তবে শৈলীর বিষয় হিসাবে নিরুৎসাহিত। ( বিভাগ 9.4 )

  2. abstractএক্সেস পরিবর্তক কারণ প্রয়োজন নেই

    একটি ডিফল্ট পদ্ধতি হল এমন একটি পদ্ধতি যা ডিফল্ট সংশোধক সহ একটি ইন্টারফেসে ঘোষিত হয় ; এর শরীর সর্বদা একটি ব্লক দ্বারা প্রতিনিধিত্ব করে

    এবং...

    একটি ইন্টারফেস পদ্ধতিতে একটি ডিফল্ট পরিবর্তক বা স্ট্যাটিক সংশোধক না থাকা স্পষ্টভাবে বিমূর্ত হয় , তাই এর দেহটি একটি ব্লক নয়, সেমিকোলন দ্বারা প্রতিনিধিত্ব করা হয়

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


উত্তরের একটি মন্তব্য বলেছে:

তাদের চিন্তা করতে না! স্টাইল পুলিশ থাকা সত্ত্বেও আমি সর্বদা সর্বদা সর্বজনীন বিমূর্তি যুক্ত করেছি, কারণ এটি বিষয়গুলি পরিষ্কার করেছে এবং পাঠককে স্মরণ করিয়ে দিচ্ছে। এখন আমি প্রমাণিত কারণ জাভা 8 এবং 9 জটিল জিনিস (user949300)

স্ট্যাকওভারফ্লো প্রশ্নে একটি মন্তব্য (18 বার ভোট দেওয়া হয়েছে) এর খণ্ডন করেছে:

এটি খারাপ কারণ জনসাধারণ হিসাবে এটি লেখার দ্বারা বোঝা যায় যে এটি অ-সর্বজনীন হতে পারে (পেসারিয়র)

কোড এর প্রভাব, বিশেষত ইন্টারফেস, গুরুত্বপূর্ণ।


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

@ ডেভিড ক্যাম্পবেল: আচ্ছা, আমি মনে করি জাভা 9 আসার পরে এই প্রশ্নটি আরও ভালভাবে জিজ্ঞাসা করা যেতে পারে। :) এখনও-তে-চূড়ান্তভাবে চূড়ান্ত হওয়া জাভা স্পেস এই প্রশ্নের উত্তর দিতে পারে।
গ্রেগ বার্গার্ড্ট

1

কোনও ব্লক স্টেটমেন্টের অভাব কি যথেষ্ট নয়? extends Objectএটি নিহিত হলেও আপনি কি ঘোষণা করতে পারবেন ?

যদি বিকাশকারী অতিরিক্ত কাজটি বুঝতে না পারে তবে সম্ভবত ভাষা বৈশিষ্ট্যের পেছনের ধারণাটি তারা পুরোপুরি বুঝতে না পারার সম্ভাবনা রয়েছে যা সংশোধনকারীদের সম্পর্কে বিভ্রান্ত হওয়ার চেয়ে আরও বড় সমস্যা।

বিকাশকারীকে অবশ্যই বুঝতে হবে যে একটি ইন্টারফেসের উদ্দেশ্য একটি চুক্তি তৈরি করা যা কোনও ক্লায়েন্ট কীভাবে কোনও বস্তুর সাথে ইন্টারেক্ট করতে পারে তা নির্ধারণ করে। এটি প্রস্তাব দেয় যে কোনও ইন্টারফেসে অবজেক্ট ইন্টারঅ্যাকশনের জন্য ব্যবহৃত কোনও পদ্ধতি ক্লায়েন্টদের কাছে প্রকাশ করা উচিত।

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


2
তাদের চিন্তা করতে না! public abstractস্টাইল পুলিশ থাকা সত্ত্বেও আমি সবসময় আগে যুক্ত করেছি , কারণ এটি বিষয়গুলি পরিষ্কার করেছে এবং পাঠককে স্মরণ করিয়ে দিচ্ছে। এখন আমি প্রমাণিত কারণ জাভা 8 এবং 9 জটিল জিনিসগুলি :-)। জাভা ইতিমধ্যে প্রচুর রিন্ডন্ড্যান্ট।
user949300

1
@ user949300 আপনি কি extends Objectপ্রত্যক্ষ থেকে প্রাপ্ত প্রতিটি শ্রেণিতে যুক্ত করবেন Object? এটি ডেভেলপারদের ইতিমধ্যে সচেতন হওয়া উচিত, এ কারণেই এটি অনুমান করা হয়। স্ক্রিনে অকেজো তথ্য যত কম, গুরুত্বপূর্ণ তথ্যটি প্রক্রিয়াকরণ করা তত সহজ। আশা করি আমি আপনাকে অন্ধকারের দিকে আসতে প্ররোচিত করেছি (এটি পান? কারণ অন্তর্নিহিত জিনিসগুলি দেখা যায় না)। যদি না হয়, এটি একটি শট হা হা মূল্য ছিল। শেষ পর্যন্ত, এটি কী নীচে
এসেছিল

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

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

@ user949300 তার অর্থ যদি কোনও ব্যবহারকারী যদি আগেই সংশোধনকারীদের অভাব এবং এর পিছনে কারণের মুখোমুখি হয়ে থাকে তবে তারা প্রশ্ন করতে পারে যে তারা যখন দেখেন তারা কেন সেখানে উপস্থিত রয়েছে, তাদের ধরে নিতে বাধ্য করা হয়েছে যে এটির পিছনে একটি প্রকৃত কারণ কেবল স্পষ্ট হওয়া ছাড়াও থাকতে পারে । আমি যদি দেখি তবে কোনও ফিট নিক্ষেপ করব না extends Object, তবে এটি অবশ্যই একটি পতাকা উত্থাপন করবে এবং কেন আমাকে প্রশ্ন করবে। পোস্টটিতে আমি যেমন উল্লেখ করেছি, এ জাতীয় কাজগুলি বোঝাতে পারে যে কোনও কিছু কীভাবে কাজ করে সে সম্পর্কে বিকাশকারীদের একটি ভুল বোঝাবুঝি হতে পারে (সমস্ত বিষয় ইতিমধ্যে প্রসারিত হতে পারে Object, তাই সুস্পষ্ট সম্প্রসারণ)
ভিন্স এমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.