3

我正在学习 scala,我正在查看 scala 样式指南的官方文档。但我很困惑为什么同样的表达同时鼓励和劝阻。
根据scala 风格指南,第一个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

4

2 回答 2

5

它在您引用的代码上方说包名称应遵循 Java 包命名约定。Java 包命名约定规定包名应该是全局唯一的,这是通过使用包作者控制下的 Internet 域名作为包名的前缀来实现的。

例如,如果您控制域example.com,那么您可以com.example._为您的包使用任何包名称,但您不能使用,例如com.microsoft.coolness.

所以,com.novell.coolness没关系,因为它遵循上述规则(假设你是 Ray Noorda),但coolness不是,因为它不遵循该规则(或者,如果它遵循该规则,那么它意味着你在控制.根域命名空间,这几乎肯定不是真的,除非你是 ICANN)。

这根本不是关于 Scala 的问题,而是关于 Java 包命名约定的问题,Scala 风格指南建议您遵循。

于 2018-11-24T05:14:49.617 回答
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实际上在范围内,我们可以对于它导入。如果您有多个来自您自己的项目但驻留在不同包中的导入,这将非常方便,因为它消除了com.novell每个导入中的。

于 2018-11-24T06:06:21.340 回答