การใช้ตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่าตัวดัดแปลงการเข้าถึงคลาสคืออะไร?


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
เหตุผลที่พบบ่อยที่สุดสำหรับประเภทของการออกแบบนี้คือการให้วิธีการใช้งาน API สาธารณะ (เช่นจากอินเทอร์เฟซหรือคลาสนามธรรมเพิ่มเติม) โดยใช้คลาสที่ไม่ใช่แบบสาธารณะ JDK นั้นประกอบไปด้วยคลาสดังกล่าว (เช่น: java.util.Collections.SingletonSet<E>มีprivateอยู่java.util.Collections)
ernest_k

คำตอบ:


8

ความเข้าใจของฉันถูกต้องหรือไม่

ใช่.

อะไรคือเหตุผลที่ถูกต้องที่จะมีตัวดัดแปลงการเข้าถึงสมาชิกที่ จำกัด น้อยกว่า

เหตุผลสองประการ:

  • บางครั้งคุณกำลังใช้อินเทอร์เฟซ วิธีการอินเตอร์เฟซจะต้องเป็นpublic
  • ทำให้การเปลี่ยนการเข้าถึงห้องเรียนของคุณโดยรวมง่ายขึ้น ตัวอย่างเช่นถ้าคุณทำเครื่องหมายวิธีการทั้งหมดที่คุณต้องการเป็นสาธารณะpublicแม้จะอยู่ในคลาสแพคเกจส่วนตัวจากนั้นทั้งหมดที่คุณต้องทำเพื่อให้ชั้นเรียนเป็นแบบสาธารณะเพิ่มpublicในการประกาศคลาส

ในที่สุดสิ่งที่มีวิธีปฏิบัติที่ดีที่สุดที่จะปฏิบัติตาม?

นั่นเป็นเรื่องของความคิดเห็นดังนั้นจึงไม่เหมาะกับคำถามหรือคำตอบ Stack Overflow ทำสิ่งที่สมเหตุสมผลกับคุณและ / หรือทีมของคุณและ / หรือทำสิ่งที่คู่มือสไตล์ของทีมบอกให้คุณทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.