在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的重构工具是否通过推进“子包”神话故意误导易受影响的年轻人?或者我在这里误解了什么?
答案 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
您将拥有不同的第二级文件系统目录。