在Java / Groovy中,afaik,必须在相应的文件夹中定义一个包。这导致存储在/a/b/c
中的所有类文件都以行package a.b.c
开头。这还有必要吗?关于约定优于配置,这不是DRY ......
当这个包定义是可选的时,会出现什么样的问题?
答案 0 :(得分:4)
虽然目录结构与包结构相匹配是常规的,但如果它们不匹配则会出现某些问题,实际上并不要求它们匹配。 Java也是如此(尽管许多人都没有意识到这一点)。
以下是一个展示这一点的例子。
groovydemo $ mkdir classes
groovydemo $
groovydemo $ cat src/groovy/com/demo/SomeClass.groovy
package com.somethingotherthandemo
class SomeClass {}
groovydemo $
groovydemo $ groovyc -d classes/ src/groovy/com/demo/SomeClass.groovy
groovydemo $ find classes -type f
classes/com/somethingotherthandemo/SomeClass.class
答案 1 :(得分:2)
在Groovy(和Grails)中使用包的原因与它们在Java中使用它们的原因相同。
包用于将类组织到逻辑命名空间中,通常通过将协作类组合在一起。
它有助于避免与其他类(Java或Groovy)发生命名冲突。
在任何有数百或数千个类的非繁琐系统中,包为组织和结构提供了非常有用的机制。
答案 2 :(得分:2)
我认为你所说的是包名是由该类所在的目录所暗示的,那你为什么要说明这一点呢?这只适用于某些情况(如Grails),其中有一个约定来确定源文件的根(例如src/groovy
)。
但是想象一下,我正在编写一个Groovy应用并在/a/b/c/D.groovy
处有一个文件,我们如何判断源文件的根是/a
,因此包名是{{1}或者源文件的根目录是b.c
,因此包名称只是/a/b
?据我所知,我们不能,因此需要在源文件中明确声明包名称。