ক্লাস অ্যাক্সেস মডিফায়ারের চেয়ে কম সীমাবদ্ধ সদস্য অ্যাক্সেস সংশোধক ব্যবহার কী?


9

বলুন কিছু সদস্যের সাথে আমার একটি ক্লাস রয়েছে, এবং সদস্যদের ক্লাসের তুলনায় কম সীমাবদ্ধ অ্যাক্সেস মডিফায়ার রয়েছে।

এর একটি দৃ concrete় উদাহরণ হতে পারে:

package apples;

class A { // package private
    public int foo() { // public (=> less restrictive than *package private*)
        return 42;
    }
}

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

  • আমার বোধগম্যতা কি সঠিক?
    • তা না হলে এর পরিণতি কী?
  • কম সীমাবদ্ধ সদস্য অ্যাক্সেস সংশোধক হওয়ার বৈধ কারণগুলি কী হতে পারে?
  • অবশেষে, অনুসরণ করার সর্বোত্তম অনুশীলনগুলি কী কী ?

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

আমি যে পরিস্থিতিটি তৈরি করেছি তা নিম্নলিখিত:

  • apples.Bএকটি সর্বজনীন পদ্ধতি সরবরাহ করে bla()যা একটি রেফারেন্স প্রদান করে apples.A.foo
  • তারপর pizzas.Cকল apples.B.blaএকটি রেফারেন্স প্রাপ্ত A.fooএবং এটি কল।
  • সুতরাং A.foo()সরাসরি দৃশ্যমান নয় C, তবে কেবল অপ্রত্যক্ষভাবে এটি অ্যাক্সেসযোগ্যB.bla()

আমি এটি পরীক্ষা করেছি এবং আমি foo() প্যাকেজের অ্যাক্সেস মডিফায়ারটিকে বেসরকারী করি কিনা তা কোনও পার্থক্য করে না।

package apples;

import java.util.function.IntSupplier;

public class B {
    public IntSupplier getReferenceToAFoo() {
        A aInstance = new A();
        return aInstance::foo;
    }
}
package pizzas;

import apples.B;

import java.util.function.IntSupplier;

public class C {
    private int callAFooIndirectly() {
        B bInstance = new B();
        IntSupplier intsupplier = bInstance.getReferenceToAFoo();
        return intsupplier.getAsInt();
    }

    public static void main(String[] args) {
        C cInstance = new C();

        int i = cInstance.callAFooIndirectly();
        System.out.println(i);
        assert 42 == i;
    }
}

2
এই ধরণের ডিজাইনের পক্ষে এখন পর্যন্ত সর্বাধিক সাধারণ কারণ হ'ল পাবলিক এপিআই পদ্ধতিগুলির প্রয়োগকরণ (যেমন ইন্টারফেস বা বর্ধিত বিমূর্ত শ্রেণি থেকে শুরু করে) অ-পাবলিক ক্লাস ব্যবহার করে। JDK নিজেই যেমন শ্রেণীর সঙ্গে পরিপূর্ণ (উদা: java.util.Collections.SingletonSet<E>হয় privateমধ্যে java.util.Collections)।
ernest_k

উত্তর:


8

আমার বোধগম্যতা কি সঠিক?

হ্যাঁ.

কম সীমাবদ্ধ সদস্য অ্যাক্সেস সংশোধক হওয়ার বৈধ কারণগুলি কী হতে পারে?

দুটি কারণ:

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

অবশেষে, অনুসরণ করার জন্য সর্বোত্তম অনুশীলনগুলি কী কী?

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

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