【发布时间】:2011-07-15 02:00:39
【问题描述】:
在不止一次的情况下,我发现自己想要一种在 Java 中无法实现的变量可见性。我希望某些成员在他们自己的类和任何子类中可见,但对包的其他部分或世界其他部分不可见。换句话说,我想要这个:
Modifier Class Package Subclass World
sub-class Y N Y N
然而Java的设计者只给了我this:
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
我想要这样的典型情况是创建抽象类时。有时我发现抽象的父级需要访问某些成员,但具体的子级也需要。我可以通过将成员设为protected 来授予他们此访问权限,但是当我真的不想这样做时,这会打开对软件包其余部分的访问权限。
完全清楚,我知道这样的修饰符在 Java 中是不可能的。我的问题是为什么 Java 中不包含这样的修饰符?它似乎(对我来说)比protected 或默认值更自然。仅仅是因为它的原因不够重要而不能被包括在内,还是与我没有考虑到的可能的副作用更相关?
【问题讨论】:
-
作为这种限制的解决方法,您可以将变量设为私有,然后使用静态内部类来实现。
-
也许是因为通常人们创建的子类与父类位于不同的包中?一个典型的例子是扩展第三方库来提供我们自己的实现。
-
@adarshr:这就是子类修饰符存在的确切原因。如果所有子类都与超类在同一个包中,则它与受保护的没有任何不同。
-
碰巧Java 1.0 有
private protected。我相信实施是错误的。在 1.1 中删除。 -
我也很怀念这种可见性,原因与@Michael 相同。将我的类放在一个单独的包(抽象超类和具体子类)中只是为了限制可见性,感觉有点“不必要”。还制作了这样的hacky解决方案,例如使超类具体化,将其作为私有成员变量添加到子类中,实现一些接口等等,它使代码比它应该的更复杂。通过在继承的同时进行封装,私有保护确实可以使事情变得更好,从而将复杂性降到最低。
标签: java language-design visibility