Why is there no sub-class visibility modifier in J

2019-01-21 12:36发布

On more than one occasion I have found myself desiring a variable visibility that is not possible in Java. I wanted certain members to be visible within their own class and within any sub-classes, but not to the rest of the package or to the rest of the world. In other words, I wanted this:

Modifier        Class     Package   Subclass  World
sub-class       Y         N         Y         N

However, the designers of Java only gave me 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

The typical case when I want something like this is when creating an abstract class. Sometimes I find the abstract parent needs access to certain members, but concrete children do as well. I can give them this access by making the members protected, but that opens up accessibility to the rest of the package when I don't really want to.

To be fully clear, I know such a modifier is not possible in Java. My question is why is such a modifier not included in Java? It seems (to me) to be a more natural visibility level than either protected or the default. Is the reason just along the lines of it not being sufficiently important to be included, or is it more related to possible side effects that I haven't considered?

3条回答
够拽才男人
2楼-- · 2019-01-21 12:53

I suppose they want to avoid the added complexity by having a non-linear access hierarchy.

You should have control over your package, so simply don't call these protected methods there.

(By the way, protected is not quite the same as sub-class and package, as non-static protected methods (if not in the same package) can't be called on arbitrary objects of the declaring class, but only on objects of the subclass the code is in. (You can see this on Object.clone(), which can only be called by the class whose object is being cloned.))

查看更多
地球回转人心会变
3楼-- · 2019-01-21 12:54

Apparently they consider being-a-subtype-of not as "close relation" as being-in-same-package-of. And for the modifier you suggest, it wouldn't differ much from protected unless the subclass were actually in a different package, and I would claim, that being in the same package, is to be considered a closer relation, than being a subclass in a completely different package.

查看更多
神经病院院长
4楼-- · 2019-01-21 12:57

You should put your class in a package of it's own and mark the member(instance variable or method) as protected. This way no other classes, except the subclasses can access that member which you market as protected. You will end up with one class in one package, if you desperately want only subclasses to access that protected member.

查看更多
登录 后发表回答