Eclipse的重构工具是否违反了Java语言规范?

时间:2010-06-16 17:22:34

标签: java eclipse

在Eclipse 3.5中,假设我有这样的包结构:

 tom.package1
 tom.package1.packageA
 tom.package1.packageB

如果我右键单击tom.package1包并转到Refactor-> Rename,则会出现一个选项“Rename subpackages”作为复选框。如果我选择它,然后将tom.package1重命名为tom.red,我的包结构会像这样结束:

tom.red
tom.red.packageA
tom.red.packageB

然而我听到了Java's packages are not hierarchical。 Java教程back that up(请参阅有关包的表观层次结构的部分)。在这种情况下,Eclipse肯定会将包视为分层。

我很好奇为什么访问说明符不能允许/限制对previous question中的“子包”的访问,因为我知道我之前曾在某处看过“子包”。

Eclipse的重构工具是否通过推进“子包”神话故意误导易受影响的年轻人?或者我在这里误解了什么?

4 个答案:

答案 0 :(得分:7)

在这种情况下,Eclipse不可能违反JLS,因为它与编译或运行Java源代码或字节码无关。

重构工具的行为与它们一样,因为这种行为对开发人员很有用。这种行为对开发人员很有用,因为对于许多意图和目的,我们将包视为层次结构(a.b.c与a.b有某种关系,即使这种关系在项目之间不一致)。这并不意味着Java本质上将它们视为分层。

人们将包视为非常分层的一个例子是配置日志框架,例如log4j。同样,它不是log4j固有的,但这就是人们在实践中使用它的方式。

答案 1 :(得分:5)

Java包不是分层的,因为从包A导入所有内容并不会导入包A.B中的所有内容。

但是,Java包确实直接对应于文件系统上的目录结构,而目录层次结构。所以Eclipse正在做正确的事情 - 它重命名目录,它自动更改重命名目录的子目录的父目录的名称(说明非常明显)。

答案 2 :(得分:2)

偶数java本身具有子包的概念:

http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html

java -ea [:< package name>“...”| :<类名> ]

启用断言。默认情况下会断言断言。

没有参数,enableassertions或-ea启用断言。如果一个参数以“...”结尾,则交换机将在指定的包和任何子包中启用断言。如果参数只是“...”,则交换机将在当前工作目录的未命名包中启用断言。如果一个参数不以“...”结尾,则交换机将在指定的类中启用断言。

如果单个命令行包含这些开关的多个实例,则在加载任何类之前会按顺序处理它们。因此,例如,要运行仅在包com.wombat.fruitbat(以及任何子包)中启用断言的程序,可以使用以下命令:

java -ea:com.wombat.fruitbat... <Main Class>

答案 3 :(得分:1)

Java的包不是分层的,但Eclipse将包存储在系统的文件结构中。

tom.package1.packageA在Windows文件系统中表示为tom/package1/packageA

当您要求Eclipse重构包名时,您要求Eclipse更改文件系统目录结构的名称。

您可以在Eclipse中使用包:

tom.package1.packageA
tom.package2.packageB
tom.package3.packageC

您将拥有不同的第二级文件系统目录。