有谁知道为什么缺少Java:
我希望我有更多选择而不是保护和默认.特别是,我对Protected-plus选项感兴趣.
假设我想使用Builder/Factory图案类来生成一个包含许多指向其他对象的链接的对象.对象上的构造函数都是默认的,因为我想强制您使用工厂类来生成实例,以确保正确完成链接.我想将工厂分组在一个子包中,以便将它们保持在一起并与它们实例化的对象区别开来 - 这对我来说似乎是一个更清洁的包结构.
目前无法做到.我必须将构建器放在与它们构造的对象相同的包中,以便获得对默认值的访问.但分离project.area.objects自project.area.objects.builders会这么漂亮.
那么为什么Java缺乏这些选择呢?并且,无论如何要假装吗?
有谁知道为什么缺少Java:
- ...
- 一个访问说明符,允许类访问,同一个包中的所有类,以及任何子包中的所有类?(默认加)
- 一个访问说明符,它将子包中的类添加到当前允许受保护访问的实体中?(被保护的加)
Java的包不是分层的 - 没有子包(即使目录结构表明它)."内部"其他包的包不是真正的子包,它们只是名称恰好以与"父"包相同的前缀开头的包.导入包时也可以看到这个; 像这样的陈述
import java.awt.*;
Run Code Online (Sandbox Code Playgroud)
只导入包中的所有内容java.awt,而不是导入包中的所有内容java.awt.image.
因此,也没有适用于子包的访问说明符.
一次一个地回答您的问题:
* An access specifier which allows access by the class and all subclasses, but NOT by other classes in the same package? (Protected-minus)
Run Code Online (Sandbox Code Playgroud)
这是在Java 1.0(private protected是修改器)并删除.我不清楚为什么,但它绝对被视为不值得麻烦的事情.当前的安排使得所有修饰符从较少限制变为更受限制,这更简单(如在较小的潜在变化中),这是Java设计目标.
* An access specifier which allows access by the class, all classes in the same package, AND all classes in any sub-package? (Default-plus)
* An access specifier which adds classes in sub-packages to the entities currently allowed access by protected? (Protected-plus)
Run Code Online (Sandbox Code Playgroud)
由于相关原因,这两个不可用.Java目前没有子包的概念,它只是假装常规文件和基于jar的类加载器(以及编译器)遵循底层文件系统的目录结构来查找文件.Java将使用JSR 294("超级包")更广泛地解决这个问题(正如其他人所指出的那样),这将使您能够更精细地控制在包外发布的内容(因此,如果您愿意,可以将内容公之于众)到,它仍然不可见).