Như những người khác đã giải thích, không có thứ như "gói phụ" trong Java: tất cả các gói đều bị cô lập và không thừa hưởng gì từ cha mẹ.
Cách dễ dàng để truy cập thành viên lớp được bảo vệ từ gói khác là mở rộng lớp và ghi đè lên các thành viên.
Ví dụ, để truy cập ClassInA
trong gói a.b
:
package a;
public class ClassInA{
private final String data;
public ClassInA(String data){ this.data = data; }
public String getData(){ return data; }
protected byte[] getDataAsBytes(){ return data.getBytes(); }
protected char[] getDataAsChars(){ return data.toCharArray(); }
}
làm cho một lớp trong gói đó sẽ ghi đè các phương pháp bạn cần trong ClassInA
:
package a.b;
import a.ClassInA;
public class ClassInAInB extends ClassInA{
ClassInAInB(String data){ super(data); }
@Override
protected byte[] getDataAsBytes(){ return super.getDataAsBytes(); }
}
đó cho phép bạn sử dụng lớp trọng thay cho lớp học trong gói khác:
package a.b;
import java.util.Arrays;
import a.ClassInA;
public class Driver{
public static void main(String[] args){
ClassInA classInA = new ClassInA("string");
System.out.println(classInA.getData());
// Will fail: getDataAsBytes() has protected access in a.ClassInA
System.out.println(Arrays.toString(classInA.getDataAsBytes()));
ClassInAInB classInAInB = new ClassInAInB("string");
System.out.println(classInAInB.getData());
// Works: getDataAsBytes() is now accessible
System.out.println(Arrays.toString(classInAInB.getDataAsBytes()));
}
}
Lưu ý rằng thao tác này chỉ hoạt động đối với các thành viên được bảo vệ, có thể hiển thị để mở rộng các lớp và không phải là thành viên riêng tư của gói. Hy vọng rằng điều này sẽ giúp một ai đó!
http://stackoverflow.com/questions/2388253/separation-of-junit-classes-into-special-test-package – Abdull
http://stackoverflow.com/questions/13809713/java-package-in-package –
Ngoài ra, các xét nghiệm chỉ nên kiểm tra * hành vi * của các đối tượng của bạn như có thể quan sát được từ bên ngoài gói. Việc truy cập các phương thức/lớp phạm vi gói từ các thử nghiệm của bạn cho tôi biết các bài kiểm tra có lẽ là việc thử nghiệm các triển khai không phải là các hành vi. Sử dụng công cụ xây dựng như maven hoặc gradle, chúng sẽ giúp bạn dễ dàng chạy thử trong cùng một classpath nhưng không được bao gồm trong jar cuối cùng (một điều tốt), do đó không cần chúng có tên gói khác nhau. Tuy nhiên, đặt chúng trong các gói riêng biệt anyways * là bắt buộc bạn không truy cập vào phạm vi riêng/mặc định * và do đó chỉ kiểm tra api công khai. – derekv