edit:我只使用过Eclipse来编程Java,所以以下所有内容(以及我对Java的所有知识)都取决于Java在该环境中的编程方式。
我有两个eclipse项目:类X的项目A和类Y项目B。项目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不是private
,类Y就可以实例化O。这意味着,即使O有默认的访问修饰符,Y仍然可以访问O的成员和变量这让我很困惑,因为我认为默认类意味着只有当外部类共享一个公共包时,它们才能访问它
因此,我从中得出的结论是,每个项目中的默认包必须是相同的,或者以某种方式连接。我这样想对吗?如果这是正确的,一个项目的包中所做的更改会反映在另一个项目中的包上吗?
这就是我正在处理的主要问题。我想控制对类O的访问,这样在我的示例中,我希望Y到而不是能够实例化O。我现在唯一能做到这一点的方法是将O的可见性设置为private,但这也限制了来自同一项目(项目A)的其他类访问O。我希望项目B中的类Y(我认为它与项目a有不同的包)不能访问O,但与Y/O来自同一项目的其他任意类可以毫无问题地访问O
这里有几个不同的问题,所以我将一一列举并回答。此外,我假设项目指的是类似Eclipse中的项目。
-
我这样想对吗
正确,如果您有多个项目(例如JAR文件构建工件Eclipse项目),每个项目都有一个默认包(例如两个项目中的
src/main/java/Foo.java
)默认范围(即包私有)类将能够看到彼此及其各自的公共、受保护和包私有方法和字段。 -
如果这是正确的,一个项目的包中所做的更改会反映在另一个项目中的包上吗
正确,假设上游项目的更改对下游项目可见。
-
我该怎么做
严格来说,你不能,除非,正如你所说,你把它保密。即便如此,你也可以绕过它。然而,你可以选择其他程序员不太可能使用的有意义的包层次结构。例如,由于这个原因,
com.acme.myproject.subfolder
等名称很常见。但有些人仍然可以在自己的项目中创建一个并行文件夹,并将您的包称为私有类。话虽如此,对于私人成员类,它们可以更改该成员的可访问性,从而绕过您。虽然这听起来可能很可怕,但如果你想要真正安全的代码,你真的应该对远程服务使用安全授权。制作package-private的目的是防止它成为API的一部分,而不是强制执行一些真正的安全性。事实上,这种行为通常是可取的。例如,假设我在src/main/java/com/acme/myproj/Foo.java
有一个包私有类,我想对它进行单元测试。Foo
类是package-private,因为我不想让它成为我的公共API的一部分。所以,我可以创建src/test/java/com/acme/myproj/FooTest.java
,瞧,我现在可以对我的包私有类Foo
执行单元测试了。
我希望这能解释问题。