我不止一次发现自己希望获得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
或默认值更自然的可见性级别。原因是它的重要性不足以包含在内,还是与我未考虑的可能的副作用更相关?
答案 0 :(得分:18)
我认为他们希望通过拥有非线性访问层次结构来避免增加的复杂性。
你应该控制你的包,所以不要在那里调用这些受保护的方法。
(顺便说一下,protected
与sub-class and package
并不完全相同,因为无法在声明的任意对象上调用非静态保护方法(如果不在同一个包中) class,但仅限于代码所在的子类的对象。(您可以在Object.clone()
上看到这一点,只能由正在克隆其对象的类调用。)
答案 1 :(得分:6)
显然,他们认为属于的子类型并不像是同一个包那样是“亲密关系”。对于你建议的修饰符,它与protected
没有多大区别,除非子类实际上在不同的包中,并且我声称,在同一个包中,被认为是一个更接近的关系,而不是是一个完全不同的包中的子类。
答案 2 :(得分:3)
您应该将您的类放在它自己的包中,并将该成员(实例变量或方法)标记为受保护。 这样,除了子类之外,没有其他类可以访问您作为受保护市场营销的成员。 如果您迫切希望只有子类访问该受保护的成员,您最终会在一个包中使用一个类。