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


292

একটি জাভা ইন্টারফেসের পদ্ধতিগুলি publicঅ্যাক্সেস মডিফায়ারের সাথে বা ছাড়াই ঘোষণা করা উচিত ?

প্রযুক্তিগতভাবে এটি কোনও ব্যাপার নয়। একটা ক্লাস পদ্ধতি যে একটি প্রয়োগ interfaceসর্বদা public। তবে এর চেয়ে ভাল কনভেনশন কী?

জাভা নিজেও এতে সামঞ্জস্যপূর্ণ নয়। উদাহরণস্বরূপ Collectionবনাম Comparable, বা Futureবনাম দেখুন ScriptEngine


22
এটা খারাপ কারণ পাবলিক হিসাবে এটি লেখা থেকেই বোঝা এটি করতে অ-সর্বজনীন হতে
Pacerier

8
আপনার কোনও রূপের অপ্রয়োজনীয় বাক্য গঠন এড়ানো উচিত।
লার্নের মারকুইস

3
@Pacerier, যখন আমি সম্মত হন যে এটি ব্যবহার করতে খারাপ publicএই প্রেক্ষাপটে, ডিফল্ট ইন্টারফেস পদ্ধতি করতে এখন (জাভা 9) ব্যক্তিগত হও। আপনার পরামর্শটি অপ্রচলিত হওয়ায় আপনি অপসারণের পরামর্শ দিচ্ছি।
আইয়ুব

2
হ্যাঁ, কিছু জাভা 9. পরিবর্তন সাপেক্ষে "পাবলিক যেমন লেখা থেকেই বোঝা এটি করতে অ-সর্বজনীন হতে" । যেহেতু জাভা 9 তে ঠিক এটি সম্ভব বলে মনে হচ্ছে, এখন এই যুক্তিটি প্রকৃতপক্ষে লেখার পক্ষে public
এমসির সম্রাট

উত্তর:


334

JLS এই স্পষ্ট করে তোলে:

ইন্টারফেসে ঘোষিত পদ্ধতির জন্য অতিরিক্ত publicএবং / অথবা abstractসংশোধককে নির্দিষ্ট করে দেওয়ার জন্য এটি অনুমোদিত তবে শৈলীর বিষয় হিসাবে নিরুৎসাহিত ।


6
উপরের জেএলএস লিঙ্কটি আমি পড়ার সময় জাভা for এর জন্য ছিল। জাভা 9 সম্পর্কে অ-সর্বজনীন পদ্ধতিগুলিকে মঞ্জুরি দেওয়ার বিষয়ে মন্তব্য করার পরে, আমি কেবল এটিই নিশ্চিত করতে চেয়েছিলাম যে এসই 9 জেএলএসের জন্য এখনও খুব অনুরূপ শব্দবন্ধ রয়েছে । ( publicঅংশটি একই, and/or abstractঅংশ বাদ দেওয়া হয়েছে)
ওজগুর

3
এখনও SE11
জেএলএসে

আপডেট: জাভা 13 ডকস.অরাকল.com
Nhu Vy

44

জাভা ইন্টারফেসে (আমার মতে) সর্বজনীন পরিবর্তনকারী বাদ দিতে হবে।

যেহেতু এটি কোনও অতিরিক্ত তথ্য যুক্ত করে না, তাই এটি গুরুত্বপূর্ণ বিষয়গুলি থেকে কেবল দৃষ্টি আকর্ষণ করে।

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

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}

3
আপনার কি এমন স্টাইল-গাইডের লিঙ্ক আছে?
বেন্নো রিখটারস 2:25

9
ধারাবাহিকতা এখন পর্যন্ত সবচেয়ে গুরুত্বপূর্ণ বিষয় এবং এই ধরণের প্রশ্নের 99% এর উত্তর to
এসসিডিএফ

সম্মত পুনরায়: ধারাবাহিকতা। আপনার কোডিং স্ট্যান্ডার্ড ডকুমেন্টস ছেলের জন্য কিছু :)
জিবিবি

2
জ্ঞান: একটি উদাহরণ জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন, অন্যটি চেকস্টাইল।
রাসমাস ফ্যাবার

9

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

সবার আগে ইন্টারফেসগুলি অসম্পৃক্ত শ্রেণির একটি সেটের জন্য সাধারণ পদ্ধতি নির্দিষ্ট করতে ব্যবহৃত হয় যার জন্য প্রতিটি শ্রেণীর একটি অনন্য বাস্তবায়ন থাকবে have সুতরাং অ্যাক্সেস মডিফায়ারটিকে ব্যক্তিগত হিসাবে নির্দিষ্ট করা সম্ভব নয় যেহেতু এটি অন্য শ্রেণীর দ্বারা ওভাররাইড করার জন্য অ্যাক্সেস করা যায় না।

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

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

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

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


7

প্রবর্তনের সঙ্গে private, static, defaultজাভা 8/9 ইন্টারফেস পদ্ধতি জন্য সংশোধনকারীদের, জিনিষ আরো জটিল পেতে এবং আমি মনে করি যে পূর্ণ ঘোষণা আরো পাঠযোগ্য (প্রয়োজন জাভা 9 কম্পাইল করার) হয় ঝোঁক:

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}

5

আমি পূর্বনির্ধারিত ডিফল্ট প্রয়োগ করা এড়াতে চাই। হিসাবে উল্লেখ করা হয়েছে, এটি অসঙ্গতি এবং বিভ্রান্তির কারণ হতে পারে।

সবচেয়ে খারাপটি আমি দেখলাম পদ্ধতিগুলির সাথে একটি ইন্টারফেস abstract...


5

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

তাই আমি সর্বোত্তম যা নিশ্চিত তা নিশ্চিত নই তবে public abstractইন্টারফেস পদ্ধতিতে ব্যবহার করা হ'ল আমি সত্যিই পছন্দ করি না । "এক্সট্র্যাক্ট ইন্টারফেস" এর সাথে রিফ্যাক্টর করার সময় কখনও কখনও গ্রহপোষ এটি করে।


2
তবে আপনি যদি দুটি চেকবক্স পরীক্ষা করে থাকেন তবে পদ্ধতিগুলি জনসাধারণ হিসাবে ঘোষণা করে, বিমূর্ত হয়।
MetroidFan2002

4

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


6
আপনি কি স্পষ্টভাবে সমস্ত ইন্টারফেস পদ্ধতি বিমূর্ত ঘোষণা করতে পারেন?
ড্যান ডায়ার 11

4
এটি একটি ইন্টারফেস, একটি বিমূর্ত শ্রেণি নয়। 'পাবলিক' হিসাবে, এটি 7 টি অক্ষর যা আপনি টাইপ করার সময় দ্বারা টাইপ করেছেন এটি বড় কথা! এবং বাস্তবায়নের ক্ষেত্রে এটি কীভাবে সংজ্ঞায়িত করা হবে, যা অতিরঞ্জিততার জন্য -1 সামঞ্জস্যের সামঞ্জস্যের জন্য +1।
জিবি 14

3

আমি এড়িয়ে যাওয়া পছন্দ করি, আমি কোথাও পড়েছি যে ইন্টারফেসগুলি ডিফল্টরূপে হয় publicএবং abstract

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

যাইহোক, আমি মনে করি অপ্রয়োজনীয় তথ্য উপেক্ষা করা উচিত।


1
কেবল স্পষ্ট publicকরে বলার জন্য, আপনি যদি ইন্টারফেস ঘোষণায় অ্যাক্সেস মডিফায়ারটিকে বাদ দেন তবে এটি সর্বজনীন হবে না এবং ডিফল্টভাবে বিমূর্ত হবে নাdocs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
জাব্লস্লাদ

3

আমি জনপ্রিয় উত্তরের সাথে একমত নই, জনসাধারণের দ্বারা বোঝা যাচ্ছে যে অন্যান্য বিকল্প রয়েছে এবং তাই এটি হওয়া উচিত নয়। সত্য যে এখন জাভা 9 এর সাথে এবং এর বাইরেও অন্যান্য বিকল্প রয়েছে।

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

বর্তমান শব্দটির এখানে নোট করুন: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4

"ইন্টারফেসের মূল অংশে একটি পদ্ধতি প্রকাশ্য বা বেসরকারী হিসাবে ঘোষণা করা যেতে পারে (§§..6) no একটি ইন্টারফেসে একটি পদ্ধতি ঘোষণার জন্য পরিবর্তনকারী। "

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


2

ডিফল্টরূপে পাবলিক এবং বিমূর্তভাবে ইন্টারফেসে পদ্ধতির কারণগুলি আমার কাছে যথেষ্ট যৌক্তিক এবং সুস্পষ্ট বলে মনে হয়।

একটি ইন্টারফেসের একটি পদ্ধতি এটি ডিফল্ট বিমূর্তি দ্বারা বাস্তবায়নকারী শ্রেণিকে একটি বাস্তবায়ন সরবরাহ করার জন্য বাধ্য করা এবং ডিফল্টরূপে সর্বজনীন হয় যাতে বাস্তবায়নকারী শ্রেণীর এটি করার অ্যাক্সেস থাকে।

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


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

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

1

এটা সম্পূর্ণ বিষয়গত। আমি অনর্থক বাদ দিইpublic মডিফায়ারটিকে কারণ এটি বিশৃঙ্খলার মতো বলে মনে হচ্ছে। যেমনটি অন্যরা উল্লেখ করেছেন - ধারাবাহিকতা এই সিদ্ধান্তের মূল বিষয়।

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


-9

লোকেরা আপনার ইন্টারফেসটি কোডের সমাপ্তি থেকে তাদের আইডিইতে বা জাভাদোকে শিখবে, উত্সটি পড়ে না। সুতরাং উত্সটিতে "পাবলিক" রাখার কোনও অর্থ নেই - উত্সটি কেউ পড়ছে না।


8
উত্সটি কেউ পড়ছে না এমন বক্তব্যের সাথে আমার সত্যই দ্বিমত পোষণ করতে হবে। আমি মনে করি প্রচুর লোক কোডে জুম করার জন্য Eclipse এ উদাহরণ F3 ব্যবহার করে। মাভেনের মতো সরঞ্জামগুলি কোনও কারণে জাভাডক নয়, উত্সগুলি ডাউনলোড করার বিকল্প সরবরাহ করে।
বেন্নো রিখটারস

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