据我所知,当其类具有访问修饰符时,不可能在 Java 内部包受保护的访问修饰符(例如internal protected
在 C# 中)中为类成员添加经典方法public
。你知道有什么方法或设计模式可以做到这一点吗?
为什么在 Java 中没有语法支持来做到这一点?(或者为什么它在 C# 中?)
据我所知,当其类具有访问修饰符时,不可能在 Java 内部包受保护的访问修饰符(例如internal protected
在 C# 中)中为类成员添加经典方法public
。你知道有什么方法或设计模式可以做到这一点吗?
为什么在 Java 中没有语法支持来做到这一点?(或者为什么它在 C# 中?)
在 Java 中,最接近的是protected
类成员和package private
类的普通修饰符。它们允许从同一个包以及继承类进行访问。
在实践中,您会发现 Java 包的命名类似于internal
暗示客户端不应直接使用此包中的类。
UPD
没有办法在编译时强制这种限制。但在运行时,您有多种选择,例如使用 Java 安全性、反射、分析堆栈跟踪。但是您应该在每种情况下评估每种解决方案的优缺点。
只是为了好玩,你可以试试这个(我怀疑这在现实世界的项目中很有用,也不确定这对生成字节码的代理或其他奇特的用例会有多好):
public class Test {
public void protectedInternal() {
// If this method is not called from an inherited class.
if (getClass() == Test.class) {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stackTrace[2]; // Corresponds to the caller stack frame.
// Check the caller is from the allowed package.
if (!e.getClassName().startsWith("my.package.")) {
throw new SecurityException("Sorry, this method is kind of protected internal :)");
}
}
}
}