【问题标题】:Internal Package Protected access modifier in JavaJava中的内部包保护访问修饰符
【发布时间】:2014-07-16 07:55:59
【问题描述】:

据我所知,当其类具有public 访问修饰符时,不可能在Java 内部包保护访问修饰符(例如C# 中的internal protected)中为类成员添加经典方法。你知道有什么方法或设计模式可以做到这一点吗?

为什么在 Java 中不支持执行此操作的语法? (或者为什么它在 C# 中?)

【问题讨论】:

标签: java design-patterns syntax protected package-private


【解决方案1】:

在 Java 中,最接近的是用于类成员的普通 protected 修饰符和用于类的 package private。它们允许从同一个包以及继承类进行访问。

在实践中,您会发现 Java 包的名称类似于 internal,这暗示客户端不应直接使用此包中的类。

更新

没有办法在编译时强制这种限制。但在运行时,您有多种选择,例如使用 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 :)");
             }
         }
     }
}

【讨论】:

  • 是的,这是真的。但是如果我想创建公共类并且只有内部受保护的成员,我该怎么办?我会准确地回答我的问题,因为我认为它可能是模棱两可的。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2013-03-05
  • 2017-05-16
  • 1970-01-01
  • 2019-05-07
  • 2014-12-29
相关资源
最近更新 更多