我正在学习scala,并且正在查看scala样式指南的官方文档。但是我很困惑为什么同一个表情同时受到鼓励和劝阻。
根据{{3}},第一个package coolness
是错误的,但是第二个package coolness
在示例中间,是正确的。
// wrong! this is definitely wrong
package coolness
// right! puts only coolness._ in scope
package com.novell.coolness
// right! puts both novell._ and coolness._ in scope
package com.novell
package coolness //but why is it OK?
// right, for package object com.novell.coolness
package com.novell
/**
* Provides classes related to coolness
*/
package object coolness {
}
已解决:我不知道超过2行的程序包声明与用点分隔的一行声明相同。
说到
package com.novell.coolness
是package com.novell; package coolness
答案 0 :(得分:4)
它在您引用的代码上方说,程序包名称应遵循Java程序包命名约定。 Java程序包命名约定规定,程序包名称应该是全局唯一的,这是通过使用Internet域名来实现的,该域名受程序包作者的控制,作为程序包名称的前缀。
例如,如果您控制域example.com
,则可以为软件包使用com.example._
之类的任何软件包名称,但是不能使用com.microsoft.coolness
。 / p>
因此,com.novell.coolness
可以,因为它遵循上述规则(假设您是Ray Noorda),但是coolness
则不是,因为它没有遵循该规则(或者,如果遵循遵循该规则,则意味着您处于.
根域名称空间的控制之下,除非您是ICANN,否则几乎可以肯定这是不正确的。
这真的根本不是关于Scala的问题,这是关于Java包命名约定的问题,Scala样式指南建议您遵循此规范。
答案 1 :(得分:3)
我只想添加一些基本原理。 Jorg所说的一切都是正确的:以下两个声明了相同的包
package com.novell.coolness
package com.novell
package coolness
但是后者有一个优势。假设我的项目结构包含这三个软件包
com.novell.coolness
com.novell.morecoolness
com.novell.utilities.coolness
现在,我正在com.novell.coolness
中编写一个文件,该文件需要使用其他两个软件包中的某些内容。如果我们使用第一个约定,则会得到
package com.novell.coolness
import com.novell.morecoolness.MyClass
import com.novell.utilities.coolness.MyOtherClass
但是,如果我们使用第二种约定,则会得到
package com.novell
package coolness
import morecoolness.MyClass
import utilities.coolness.MyOtherClass
因此com.novell
实际上在范围内,我们可以将 relative 导入其中。如果您有几个来自您自己项目的导入文件,但它们位于不同的程序包中,则这会非常方便,因为它消除了每个导入文件中的com.novell
。