为什么Java缺少访问说明符?

时间:2010-06-14 17:21:30

标签: java oop

有没有人理解为什么缺少Java:

  • 一个访问说明符,它允许类和所有子类访问,但不允许同一个包中的其他类访问? (保护-负)
  • 一个访问说明符,允许类访问,同一个包中的所有类,以及任何子包中的所有类? (默认加)
  • 一个访问说明符,它将子包中的类添加到当前允许受保护访问的实体中? (保护加)

我希望我有更多的选择而不是受保护和默认。特别是,我对Protected-plus选项感兴趣。

假设我想使用Builder / Factory图案类来生成一个包含许多指向其他对象的链接的对象。对象上的构造函数都是默认的,因为我想强制您使用工厂类来生成实例,以确保正确完成链接。我希望将工厂分组到一个子包中,以便将它们保持在一起并与它们实例化的对象区分开来 - 这对我来说似乎是一个更清洁的包结构。

目前无法做到。我必须将构建器放在与它们构造的对象相同的包中,以便获得对默认值的访问。但是将project.area.objectsproject.area.objects.builders分开会非常好。

那么为什么Java缺少这些选项呢?并且,无论如何都要伪造它?

5 个答案:

答案 0 :(得分:7)

  

有没有人理解为什么缺少Java:

     
      
  • ...
  •   
  • 一个访问说明符,允许类访问,同一个包中的所有类,以及任何子包中的所有类? (默认加)
  •   
  • 一个访问说明符,它将子包中的类添加到当前允许受保护访问的实体中? (保护加)
  •   

Java的包不是分层的 - 没有子包(即使目录结构表明它)。 “内部”其他包的包不是真正的子包,它们只是名称恰好以与“父”包相同的前缀开头的包。导入包时也可以看到这个;像

这样的陈述
import java.awt.*;

仅导入包java.awt中的所有内容,而不是导入java.awt.image中的所有内容。

因此,也没有适用于子包的访问说明符。

答案 1 :(得分:5)

一次一个地回答您的问题:

* An access specifier which allows access by the class and all subclasses, but NOT by other classes in the same package? (Protected-minus)

这是在Java 1.0中(private protectedmodifier)并已删除。我不清楚为什么,但它绝对被视为不值得麻烦的事情。当前的安排使得所有修饰符从较少限制变为更受限制,这更简单(如在较小的潜在变化中),这是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)

这两个因相关原因无法使用。 Java目前没有子包的概念,它只是假装常规文件和基于jar的类加载器(以及编译器)遵循底层文件系统的目录结构来查找文件。 Java将使用JSR 294(“超级包”)更广泛地解决这个问题(正如其他人所指出的那样),这将使您能够更精细地控制在包外发布的内容(因此,如果您愿意,可以将内容公之于众)到,它仍然不会被看见。

答案 2 :(得分:3)

查看据报道将在Java 7中出现的超级软件包功能:

答案 3 :(得分:1)

据推测,要保持简单。

虽然我们讨论的是:我错过了一个访问说明符,它允许仅使用this指针(对象级而不是类级封装)修改字段。能够为读取和写入字段指定不同的访问修饰符会很好。

编辑:Java语言设计中的特定目标是simple language,特别是与C ++相关。当然,这是以表现力为代价的; Java中的一些事情比C ++更难做,因为编译器提供的支持较少。考虑遗漏const。安全地将只读引用暴露给内部状态非常麻烦。但是,它还可以防止初学者被与const正确性相关的众多编译器错误所迷惑。

答案 4 :(得分:-1)

我认为你的问题的一部分在这句话中:

  

对象上的构造函数都是默认的,因为我想强制您使用工厂类来生成实例,以确保链接正确完成

您是否真的需要强制您的代码用户才能使用某些方法/构造函数?

你能不能简单地记录一下“为了让这个类正常工作,所有实例都必须使用这个工厂构建?”并相信他们会遵循你给他们的文件?

任何偏离您的文档的人都要冒着风险自担风险。