Giả sử tôi có một lớp với một số thành viên và các thành viên có công cụ sửa đổi truy cập ít hạn chế hơn so với chính lớp đó.
Một ví dụ cụ thể có thể là:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Theo hiểu biết của tôi, một công cụ sửa đổi truy cập lớp hạn chế hơn công cụ sửa đổi truy cập thành viên , sẽ ghi đè lên công cụ sửa đổi truy cập thành viên ít hạn chế hơn . Vì vậy, một sửa đổi truy cập thành viên ít hạn chế hơn sẽ không có hiệu lực nào cả.
- Tôi hiểu có đúng không?
- Nếu không, hậu quả là gì?
- Điều gì có thể là lý do hợp lệ để có sửa đổi truy cập thành viên ít hạn chế hơn?
- Cuối cùng, những gì là thực hành tốt nhất để làm theo?
Tôi cũng đã thực hiện một số thử nghiệm vì tôi nghĩ rằng nó có thể có hậu quả khi tôi bắt đầu chuyển các tham chiếu hàm xung quanh, tuy nhiên ngay cả khi đó công cụ sửa đổi truy cập dường như không quan trọng.
Tình huống mà tôi xây dựng như sau:
apples.B
cung cấp một phương thức công khaibla()
trả về một tham chiếu đếnapples.A.foo
.- Sau đó
pizzas.C
gọiapples.B.bla
để có được một tài liệu tham khảoA.foo
và gọi nó. - Vì vậy,
A.foo()
không thể nhìn thấy trực tiếpC
, nhưng chỉ có thể truy cập gián tiếp thông quaB.bla()
Tôi đã thử nghiệm nó và nó không tạo ra sự khác biệt cho dù tôi có sửa đổi truy cập của foo()
gói riêng tư hay không.
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;
}
}
java.util.Collections.SingletonSet<E>
làprivate
trongjava.util.Collections
).