2016-04-09 110 views
1

编辑:我只用过Eclipse来编写Java,因此以下所有内容(以及我在Java方面的所有知识)都取决于Java在该环境中的编程方式。跨项目的继承和可视性

我有两个Eclipse项目:项目一个带班X和项目Y类。类别Y来自项目B扩展类X来自项目A

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

Xpublic,它有一个嵌套类Ò

public class X { 

    class O { // default access modifier 

    } 
} 

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

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

这提出了我正在处理的主要问题。我想控制访问类Ø这样,在我的例子,我想Ÿ能够实例Ø。我现在唯一能做的就是将O的可见性设置为私有,但这也限制了同一项目中的其他类(项目A)访问O。我想通过这门课Ÿ从项目(我认为是从项目一个有不同的封装)能够访问Ø但是从同一项目为Y一些其他任意类/ O有访问O没有问题。我怎样才能做到这一点?

+1

小心,Java语言中没有项目的概念。可见性适用于软件包。 – Savior

+0

哦,我指的是具体的日食 – Manuel

+0

你不能对可见度进行个案限制。默认访问修饰符给予同一包访问中的类;如果您希望_Y_无法访问_O_,请考虑将_Y_移动到另一个软件包。 – Jire

回答

1

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

  1. 我正确的想这么做吗?

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

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

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

  3. 我该怎么做?

    严格地说,除非像你说的那样,你不能让它变成私人的。即使如此,你可以绕过它。然而,你可以做的是选择有意义的包层次结构,其他编码人员不太可能使用。例如,由于这个原因,诸如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.javaFoo类是包私有的,因为我不想让它成为我的公共API的一部分。所以,我可以创建src/test/java/com/acme/myproj/FooTest.java和瞧,我现在可以执行unit tests against my package-private classFoo

我希望能解释一些事情。