【问题标题】:Access levels of classes in java [duplicate]java中类的访问级别[重复]
【发布时间】:2018-01-12 09:29:11
【问题描述】:

子包中的类需要访问上一级包中的类。所以,我需要保持目标类公开。但我不希望该类被任何其他类访问。我能做什么?

【问题讨论】:

  • protecteddefault 访问修饰符当然会帮助您进行一些修改。或者使用代理类。
  • java 中的包不是分层的。所以包“java.util.concurrent”与“java.util”无关。它不是一个子包,也可能是“foo.bar.concurrent”。

标签: java class packages


【解决方案1】:

您没有十几种解决方案。
Java 不是具有“朋友类”概念的 C++ 或 OOP 语言。
protected 修饰符为子类提供特权访问,但您不会子类化依赖项来访问它。
这真的没有意义。

因此,如果您可以重构:将用户类移动到与使用的类相同的包中,并使用私有包修饰符。

否则,将类设为公共工厂类的私有嵌套类,该类将返回与您要保护访问的类 API 匹配的特定接口的实例。
这样,客户端类将只与接口 API 进行通信。
当然,任何类仍然可以检索实例,但永远不会与实现类耦合。
所以在某种程度上,它保护了对类的访问。

FooAPI

public interface FooAPI {
    void foo();
    //....   
}

FooFactory

public class FooFactory{

   private MyFactory(){
   } 

   private class MyPrivateFoo implements FooAPI{
        // implements the interface methods 
        @Overrided
        public void foo(){
             // ....
        }
   }  

   public FooAPI of(){
       return new MyPrivateFoo();
   }
}

编辑您的评论:

使用的类具有更改其状态的公共方法。仅有的 允许特定类更改其状态,其他类则不允许。如何 可以解决吗?

关于类访问含义的问题不是很清楚。
有了这个评论,就一目了然了。

状态改变是一种功能性行为。
您想保护特定类的实例的状态变化吗?
所以让这个类负责决定状态是否应该改变。
不要提供允许直接执行此操作的公共方法。
你必须改变你的设计。
例如,在具有您想要控制的状态的类中引入公共 doProcessing() 方法,并让此方法负责更改相关的状态实例。
您可能对提供一种自然而直接的方法来解决此类问题的领域模型设计感兴趣。

为了确保行为的有效性,您拥有一个强大的工具:单元测试和集成测试。
所以请使用它们。

【讨论】:

  • 如果有很多类使用顶级包中的类怎么办?
  • 我不确定。
  • 使用的类具有改变其状态的公共方法。只有特定的类被允许改变它的状态,其他的则不允许。如何解决?
  • 我明白了。我更新了。希望对您有所帮助。
【解决方案2】:

使用受保护的修饰符,以便子类和包级类可以单独访问它

有关访问级别的详细信息,请参阅链接

https://www.programcreek.com/2011/11/java-access-level-public-protected-private/

【讨论】:

  • 投反对票的人给出原因?
  • 请勿使用链接为您解答。链接可以挂掉……见How to Answer(PS:让我有时间给我的理由……)
  • 好的将编辑它。谢谢@AxelH
  • @davidxxx 解释一下....有依赖,那为什么还要有继承呢?
【解决方案3】:

根据具体情况重构代码:

  • 使子包中的类从该类继承上一级。
  • 在子包中创建一个接口,提供您要访问的方法,并让包中的类实现它。
  • 移动其中一个类。

【讨论】:

    【解决方案4】:

    一个类不能是私有的或受保护的。类的唯一访问修饰符是 public 或 no-modifier。但是你可以使用 public、private、protected 或 no-modifier 作为内部类。

    一个类可以访问同一个包中另一个类的所有属性,除了私有修饰符。

    在父类中保持所有属性受保护。因此,只有来自同一包或其他包的子类才能访问父类属性。其他班级将无法访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2015-02-11
      相关资源
      最近更新 更多