वर्ग अभिगमन संशोधक की तुलना में कम प्रतिबंधात्मक सदस्य अभिगम संशोधकों का उपयोग क्या है?


9

मान लें कि मेरे पास कुछ सदस्यों के साथ एक वर्ग है, और सदस्यों के पास कक्षा की तुलना में कम प्रतिबंधक पहुंच संशोधक है।

एक ठोस उदाहरण हो सकता है:

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घोषित करने के लिए आपको सभी को सार्वजनिक करना होगा।

अंत में, पालन करने के लिए सबसे अच्छा अभ्यास क्या हैं?

यह एक राय का विषय है, इसलिए स्टैक ओवरफ्लो प्रश्न या उत्तर के लिए अच्छी तरह से अनुकूल नहीं है। वह करें जो आपको और / या आपकी टीम को उचित लगता है, और / या जो आपकी टीम की स्टाइल गाइड आपको करने के लिए कहती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.