跨项目的继承和可见性

Inheritance and visibility across projects

编辑:我只用过 Eclipse 来编程 Java,所以以下所有内容(以及我对 Java 的所有知识)都取决于 Java 是如何编程的环境。

我有两个 eclipse 项目:Project A with class X 和 Project B 与 class Y。 Class Y 来自项目 B 扩展 class X 来自项目 A

public class Y extends X // In short B is dependent on Project A

Class Xpublic 并且它有一个嵌套的 class O.

public class X {

    class O { // default access modifier

    }
}

在我的设置中,class Y 可以实例化 O 只要 O 不是 private。意思是,即使 O 有一个默认的访问修饰符,Y 仍然可以访问 O 的成员并且变量。 这让我感到困惑,因为我认为默认 classes 意味着外国 classes 只有共享一个公共包才能访问它。

所以我从这里得到的结论是每个项目中的默认包必须相同或以某种方式连接。我这样想对吗?如果这是正确的,在一个项目的包中所做的更改是否会反映在另一个项目的包中?

这就是我要处理的主要问题。我想控制对 class O 的访问,这样在我的示例中,我希望 Ynot能够实例化O。我现在唯一能做到的是将 O 的可见性设置为私有,但这也限制了来自同一项目(项目 A)的其他 classes 访问 O。我想要 class Y 来自项目 B (我认为它与项目 A[=55 有不同的包=]) not 无法访问 O 但来自与 Y/O 相同项目的其他任意 class 具有访问 O 没有问题。我该怎么做?

这里有几个不同的问题,所以我将列举它们并单独回答。另外,我假设 project 你指的是像 Eclipse 中的项目。

  1. 我这样想对吗?

    正确,如果您有多个项目(例如 JAR 文件构建工件 Eclipse 项目),每个项目都有一个默认包(例如两个项目中的 src/main/java/Foo.java)默认范围(即 package-private)类 将能够看到彼此及其各自的 public、受保护和包私有方法和字段。

  2. 如果这是正确的,在一个项目的包中所做的更改是否会反映在另一个项目的包中?

    正确,假设 changes of the upstream project are visible to the downstream project.

  3. 我该怎么做?

    严格来说,除非如您所说,将其设为私有,否则不能。即使那样,您也可以规避它。但是,您可以做的是选择其他编码人员不太可能使用的有意义的包层次结构。例如,com.acme.myproject.subfolder 之类的名称因此很常见。但是有人仍然可以在他们自己的项目中创建一个并行文件夹并将您的包称为私有 类。也就是说,对于私有成员 类,他们可以 change the accessibility of that member, thereby circumventing you. While that may sound scary, if you want truly secure code, you really ought to use secure authorization to remote services. The purpose of making something package-private is to prevent it from being part of your API, rather than enforcing some true security. In fact, often this behavior is desirable. For example, suppose I have a package-private class at src/main/java/com/acme/myproj/Foo.java that I want to unit test. The Foo class is package-private because I don't want to make it part of my public API. So, I can just create src/test/java/com/acme/myproj/FooTest.java and voila, I can now execute unit tests against my package-private class Foo.

我希望这能解释清楚。