Mic*_*wan 69 java visibility language-design
不止一次,我发现自己希望获得Java中不可能的可变可见性.我希望某些成员在他们自己的类和任何子类中都可见,但不是对包的其余部分或世界其他地方都可见.换句话说,我想要这个:
Modifier Class Package Subclass World
sub-class Y N Y N
Run Code Online (Sandbox Code Playgroud)
然而,Java的设计者只给了我这个:
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
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西的典型情况是创建一个抽象类.有时候我发现抽象的父母需要访问某些成员,但具体的孩子也会这样做.我可以通过创建成员来为他们提供这种访问权限protected,但是当我不想要时,这会打开对包的其余部分的可访问性.
要完全清楚,我知道Java中不可能有这样的修饰符.我的问题是为什么这样的修饰符不包含在Java中?似乎(对我而言)是一个比任何一个protected或默认的更自然的可见性水平.原因是它的重要性不足以被纳入,还是与我未考虑的可能的副作用更相关?
Paŭ*_*ann 19
我想他们希望通过拥有非线性访问层次结构来避免增加的复杂性.
你应该控制你的包,所以不要在那里调用这些受保护的方法.
(顺便说一句,protected并不完全相同sub-class and package,因为非静态保护方法(如果不在同一个包中)不能在声明类的任意对象上调用,而只能在代码所在的子类的对象上调用.(你可以看到这个Object.clone(),只能被克隆对象的类调用.))
显然,他们认为是一种子类型,而不是" 同类包装 "中的"亲密关系" .对于你建议的修饰符,protected除非子类实际上在不同的包中,否则它不会有太大的不同,并且我声称,在同一个包中,被认为是一个更接近的关系,而不是一个子类.完全不同的包装.