为什么我们仍然在Groovy / Grails中使用package关键字?

时间:2014-04-30 20:41:28

标签: grails groovy

在Java / Groovy中,afaik,必须在相应的文件夹中定义一个包。这导致存储在/a/b/c中的所有类文件都以行package a.b.c开头。这还有必要吗?关于约定优于配置,这不是DRY ......

当这个包定义是可选的时,会出现什么样的问题?

3 个答案:

答案 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中使用它们的原因相同。

  1. 包用于将类组织到逻辑命名空间中,通常通过将协作类组合在一起。

  2. 它有助于避免与其他类(Java或Groovy)发生命名冲突。

  3. 在任何有数百或数千个类的非繁琐系统中,包为组织和结构提供了非常有用的机制。

答案 2 :(得分:2)

我认为你所说的是包名是由该类所在的目录所暗示的,那你为什么要说明这一点呢?这只适用于某些情况(如Grails),其中有一个约定来确定源文件的根(例如src/groovy)。

但是想象一下,我正在编写一个Groovy应用并在/a/b/c/D.groovy处有一个文件,我们如何判断源文件的根是/a,因此包名是{{1}或者源文件的根目录是b.c,因此包名称只是/a/b?据我所知,我们不能,因此需要在源文件中明确声明包名称。