1

编辑:我只使用过 Eclipse 来编写 Java,因此以下所有内容(以及我对 Java 的所有知识)都取决于 Java 在该环境中的编程方式。

我有两个 Eclipse 项目:项目AX类和项目BY类。项目B的Y类扩展了项目A 的X类。

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

X类是public并且它有一个嵌套类O

public class X {

    class O { // default access modifier

    }
}

在我的设置中,只要O不是,类Y就可以实例化O。这意味着,即使O具有默认访问修饰符,Y仍然可以访问O的成员和变量。这让我很困惑,因为我认为默认类意味着外部类只有在共享一个公共包时才能访问它。private

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

这提出了我正在处理的主要问题。我想控制对O类的访问,以便在我的示例中,我希望Y不能实例化O。我现在唯一能做到的方法是将 O 的可见性设置为私有,但这也限制了来自同一项目(项目A)的其他类访问O。我希望项目B中的Y类(我认为与项目A有不同的包)无法访问O但与 Y/O 相同的项目中的其他任意类可以访问O没有问题。我怎样才能做到这一点?

4

1 回答 1

1

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

  1. 我这样想对吗?

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

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

    正确,假设上游项目的更改对下游项目是可见的

  3. 我怎样才能做到这一点?

    严格来说,除非如您所说,您不能将其设为私有。即使那样,您也可以规避它。但是,您可以做的是选择其他编码人员不太可能使用的有意义的包层次结构。例如,com.acme.myproject.subfolder出于这个原因,诸如此类的名称很常见。但是有人仍然可以在他们自己的项目中创建一个并行文件夹并调用您的包私有类。话虽如此,对于私有成员类,它们可以更改该成员的可访问性,从而绕过您。虽然这听起来很可怕,但如果你想要真正安全的代码,你真的应该对远程服务使用安全授权。将某些东西设为包私有的目的是防止它成为您的 API 的一部分,而不是强制执行一些真正的安全性。事实上,这种行为通常是可取的。例如,假设我有一个包私有类src/main/java/com/acme/myproj/Foo.java,我想对其进行单元测试。该类Foo是包私有的,因为我不想让它成为我的公共 API 的一部分。所以,我可以创建src/test/java/com/acme/myproj/FooTest.java并瞧,我现在可以对我的 package-private class 执行单元测试 Foo

我希望这能解释事情。

于 2016-04-09T03:48:06.063 回答