编辑:我只使用Eclipse来编写Java,所以以下所有(以及我对Java的所有知识)都依赖于Java在该环境中的编程方式。
我有两个日食项目:项目 A ,类 X ,项目 B ,类 Y 。项目 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的可见性设置为私有,但这也限制了来自同一项目(项目 A )的其他类访问 O 。我希望项目 B 中的课程 Y (我认为它与项目 A 有不同的包装)不能能够访问 O ,但与Y / O相同的项目中的其他任意类可以访问 O 而没有任何问题。我怎么能这样做?
答案 0 :(得分:1)
这里有几个不同的问题,所以我会列举它们并单独回答。另外,我假设通过 project 你指的是Eclipse中的项目。
我是否认为这是正确的?
正确,如果你有多个项目(例如JAR文件构建工件Eclipse项目),每个项目都有一个默认包(例如两个项目中的src/main/java/Foo.java
)默认范围(即package-private)类将能够查看彼此及其各自的公共,受保护和包私有方法和字段。
如果这是正确的,那么一个项目的包中所做的更改是否会反映在另一个项目的包中?
正确,假设changes of the upstream project are visible to the downstream project。
我该怎么做?
严格来说,除非如你所说,否则你不能私有化。即便如此,你也可以规避它。但是,您可以做的是选择其他编码器不太可能使用的有意义的包层次结构。例如,com.acme.myproject.subfolder
之类的名称因此而常见。但是有人仍然可以在他们自己的项目中创建一个并行文件夹并调用你的包私有类。话虽这么说,对于私人会员班,他们可以change the accessibility of that member,从而规避你。虽然这可能听起来很可怕,但如果你想要真正安全的代码,你真的应该对远程服务使用安全授权。制作包私有的目的是prevent it from being part of your API,而不是强制实施一些真正的安全性。事实上,这种行为通常是可取的。例如,假设我在src/main/java/com/acme/myproj/Foo.java
有一个包私有类,我想进行单元测试。 Foo
类是包私有的,因为我不想让它成为我的公共API的一部分。所以,我可以创建src/test/java/com/acme/myproj/FooTest.java
瞧,我现在可以执行unit tests against my package-private class Foo
。
我希望这可以解释事情。