【问题标题】:Is it possible to achieve the following access levels是否可以实现以下访问级别
【发布时间】:2012-09-18 06:21:09
【问题描述】:

请让我知道这些访问级别在 java 中是否可行,如果不可行,还有什么替代方案。

问题一:

From same class:                yes
From subclass same package:     yes
From any class same package:    no
From subclass outside package:  no
From any class outside package: no

和 问题2:

From same class:                yes
From subclass same package:     yes
From any class same package:    no
From subclass outside package:  yes
From any class outside package: no

没有一个访问修饰符(public/private/default/protected)提供上述控制集。

例如: 我有一个只能在同一个类中访问的私有成员。如我的第一个问题所述,如何对其进行访问控制?

【问题讨论】:

  • 这是homework吗?如果是这样,那么标记它是有利的。另外:你怎么看,为什么?
  • 不是作业。我已经进一步解释了我的问题。

标签: java access-modifiers


【解决方案1】:

没有一个 java 作用域符合您的要求

【讨论】:

  • 他们通过从不引用包中其他任何地方的这些变量来解决它。您可以控制包中的类,因此不必担心那里的可访问性限制。
【解决方案2】:

java 中可用的访问说明符不符合您的要求。

没有区别

From subclass same package:      
From subclass outside package:    

【讨论】:

  • 假设是否需要这种级别的访问权限。有解决办法吗?
  • 我不确定@John ...您希望您的类被子类化并且可以在包内访问属性吗?为什么包装在这里如此重要?它只是一组类。
【解决方案3】:

【讨论】:

  • 它没有提供我想要的东西
【解决方案4】:

此细分应该可以帮助您确定答案。

From same class:                 //private, default, protected, public
From subclass same package:      //default, protected, public
From any class same package:     //default, protected public
From subclass outside package:   //protected, public
From any class outside package:  //public

【讨论】:

  • 这是不正确的,在 java 中,protected 默认具有更广泛的范围。任何类相同的包都适用于受保护的。
  • @chaitanya10:我已经澄清了我的问题。
【解决方案5】:

不,不可能达到您想要的 2 访问级别要求。

Java 中只有 4 个访问级别,public、default、protected 和 private。它们都不符合您的要求。

【讨论】:

    【解决方案6】:

    不同包中的子类不能被赋予单独的访问级别。

    唯一可能的解决方法是重新构建包:-(

    【讨论】:

      【解决方案7】:

      是的,这是可能的。但如上所述,它不是通过简单地使用默认可用的访问修饰符来实现的。你需要添加一个 getter 来控制对你的属性或方法的访问。

      package house;
      
      public class Father {
          private String secret = "I am your father";
      
          // for Q1 use default, for Q2 use protected
          protected String getSecret() {
              if(this.getClass().getName() != "house.Father") return secret;
              else return "some talk about the weather...";
          }
      }
      

      这个 getter 允许通过继承独占访问,并且始终可以直接访问私有属性。但通过引用访问被拒绝。

      【讨论】:

        猜你喜欢
        • 2011-10-01
        • 1970-01-01
        • 2016-11-21
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2016-01-04
        • 1970-01-01
        相关资源
        最近更新 更多