Java包名中的单词分隔符惯例是什么?

522
如何在包名中分离单词?下列哪种写法是正确的?
  1. com.stackoverflow.my_package (使用下划线的蛇形命名法)
  2. com.stackoverflow.my-package (使用连字符的烤串命名法)
  3. com.stackoverflow.myPackage (驼峰命名法)
  4. com.stackoverflow.MyPackage (帕斯卡命名法)
一般标准是什么?

30
还有一个还没有提到的例子,是使用句点:com.stackoverflow.my.package - Brad Cupit
25
这不是合法的Java代码。不清楚为什么你会问它。 - user207421
请注意,所有这些都只是为了确保唯一性。实际强制执行的唯一事项是不要进入java.*空间。 - Thorbjørn Ravn Andersen
6个回答

418

这三个都不是惯例。

使用com.stackoverflow.mypackage

包名不遵循驼峰式、下划线或连字符的包命名惯例

此外,Google Java 样式指南 也明确规定了相同的约定(即 com.stackoverflow.mypackage):

5.2.1 包名

包名全部小写,连续的单词只是简单地连接在一起(没有下划线)。例如:com.example.deepspace,不要使用 com.example.deepSpacecom.example.deep_space

Google Java样式指南:5.2 各种标识符类型的规则:5.2.1 包名


11
我部分同意-按照Java命名规范,它们并不“错误”,但在我看来不应该使用。(http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html) - Andreas Dolk
1
@JoseGómez "前缀"。所以在我看来,这并不排除包名中的所有其他单词采用驼峰式或蛇形命名法。 - Antek
4
我一直遵循这个惯例。但是,可读性确实不太好。全部使用小写字母的原因是什么? - Haomin
8
在Java包命名约定页面中建议使用下划线。例如:"org.example.hyphenated_name" 链接在答案中提供。 - Debanshu Kundu
5
@Haomin:原因是软件包使用底层文件系统,该文件系统可能区分大小写或不区分大小写。对于多开发者、多平台的项目而言,这可能会导致文件夹名称的问题。 - khaemuaset
显示剩余2条评论

301

以下是官方命名规范文件的规定:

唯一包名称的前缀始终以小写ASCII字母编写,并且应该是顶级域名之一,目前为comedugovmilnetorg或根据ISO标准3166, 1981指定的标识国家的英语两位字母代码之一。

包名称的后续组件根据组织自己的内部命名约定而变化。这样的约定可能会指定某些目录名组件为部门、项目、机器或登录名。

示例

  • com.sun.eng
  • com.apple.quicktime.v2
  • edu.cmu.cs.bovik.cheese

参考资料


请注意,特别是在顶级域前缀后面的任何内容都没有在上述文件中指定。JLS也通过以下示例表示同意:
  • com.sun.sunsoft.DOE
  • gov.whitehouse.socks.mousefinder
  • com.JavaSoft.jag.Oak
  • org.npr.pledge.driver
  • uk.ac.city.rugby.game
以下摘录也与此相关:

在某些情况下,互联网域名可能不是有效的包名。以下是处理这些情况的建议约定:

  • 如果域名包含连字符或任何其他标识符中不允许的特殊字符,请将其转换为下划线。
  • 如果任何生成的包名组件都是关键字,则将下划线附加到它们。
  • 如果任何生成的包名组件以数字或任何其他标识符的初始字符不允许的字符开头,请在该组件前加上下划线。

参考文献


65
第7.7章甚至建议在包名中使用下划线! - Andreas Dolk
2
更新参考文献:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.1(没有6.8.1和7.7了) - Victor
8
在这里:http://www.oracle.com/technetwork/java/codeconventions-135099.html中说应全小写,但在这里http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1中说第一个组件应该小写,而且他们删除了大写单词分隔的示例。另外,在这里:http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html中说应全小写。因此,目前不鼓励在包名中使用大写字母。 - dhblah
56
第7.7章并不建议使用下划线,它建议用下划线替换特殊/无效符号,这与仅仅推荐一般使用相距甚远。 - eduard.dudar

38

任何人都可以使用下划线_(没关系)

没有人应该使用连字符-(这是不好的做法)

包名内部不应该有大写字母(不好的做法)

注意:这里的“不好的做法”指的是尽管技术上允许使用,但从约定俗成的角度来看,写法并不好。

来源:命名包(docs.oracle)


105
使用连字号是不好的做法,因为它是一个错误。编写无法编译的代码确实是不好的做法。 - glglgl
好的链接-当你知道源代码内容时,它有助于给这个上下文一些意义。我也习惯于使用全小写约定。但是根据文档,看起来这只是一个选择/风格问题。我已经添加了一条评论到特定的帖子中询问关于包名称驼峰命名法(我不认为这是这个帖子的重复,顺便说一下,这个帖子只是要求概括性的约定)。https://stackoverflow.com/questions/36755783/can-we-use-camel-case-in-java-package-naming - Gene Bo
“不要使用大写字母”,虽然我同意全大写或类似于类名的写法是不好的,但这也会消除 thisExample 这样的写法。仅仅说“这是不好的习惯”是我能想到的最没有说服力、含糊不清和毫无意义的理由。能否详细阐述一下?(即定义“不良习惯”) - Manius
该文档指出:“唯一包名的前缀始终以全小写形式书写...”。我的理解是,它指的是试图反映顶级域名的前缀,而不是整个包名。但看起来人们已经统一使用全小写。 - Juanpa
这个问题是关于命名由两个或更多单词组成的包时使用的约定,例如“mypackage”(或者你想要的任何名称)。你提供的链接是关于在使用反向域来前缀包或在包中使用保留字像int时处理连字符或其他非法字符的情况。 - user904963
显示剩余2条评论

20
官方的命名规范并不是那么严格,除了前缀(例如你的示例中的com)之外,它们甚至没有“禁止”使用驼峰命名法。
但是我个人会避免使用大写字母和连字符,甚至数字。我也会选择像Bragboy建议的com.stackoverflow.mypackage这样的命名方式。
(连字符“-”在包名中是不合法的) 编辑 有趣的是,语言规范对命名约定也有所规定。
第7.7章 独特的包名中,我们看到一些包名由大写字母组成(因此驼峰命名法是可以接受的),他们建议用下划线替换连字符("mary-lou" -> "mary_lou"),并在前缀java关键字时加上下划线("com.example.enum" -> "com.example._enum")。
在包名中使用大写字母的更多示例可以在第6.8.1 包名章节中找到。

2
正如Andreas所指出的那样,在包名称中使用大写字母并没有什么“规则”。避免使用大写字母的一个具体原因是,我曾经看到人们在进行跨平台开发时遇到了大小写混合的包名称问题。特别是当有人决定重命名或更改包的大小写时,您就需要依赖于您的版本控制系统和开发环境来确保目录大小写完全正确。 - Shorn
2
实际上,有一个规则:“唯一包名的前缀总是用小写ASCII字母编写”(http://www.oracle.com/technetwork/java/codeconventions-135099.html) - Jose Gómez

7
下划线在包名中看起来很丑。就这个问题而言,对于由三个或更多单词组成的名称,我使用首字母缩写(例如:com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo),然后在package-info.java中记录包的目的。

4
仅凭包名,可能无法读懂和理解包内的内容。 - Vishal Akkalkote
2
很好。这就是为什么我建议使用文档的原因。我会随时使用这种方法,而不是将完整单词连接在一起(例如apiratesheet - 这是“API费率表”还是“海盗表”?) - jpangamarca
1
这是程序开发相关的内容,翻译成中文如下:只是你的口味而已。我有两个服务名称分别为poirot_a和poirot_b。我不喜欢使用包poriot.a,因为可能会有人想将东西放入poirot包中,这样可能没有意义。 - Simon Logic

2

大部分开发者不会在包名中使用单词拼接。

您可以使用以下形式:

com.stackoverflow.mypackage

请参考 JLS Name Declaration


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接