Java包名称中的单词分隔符的约定是什么?


370

包名称中应如何单独使用一个单词?以下哪项是正确的?

  1. com.stackoverflow.my_package (下划线)
  2. com.stackoverflow.my-package (连字符)
  3. com.stackoverflow.MyPackage (骆驼香烟盒)

一般标准是什么?


15
另一个尚未提及的示例使用句点:com.stackoverflow.my.package
布拉德·库比

11
(2)不是合法的Java。不清楚为什么还要问这个。
罗恩侯爵

注意,所有这些只是为了确保唯一性。实际执行的唯一操作是不要进入java。*空间。
托尔比约恩Ravn的安徒生

Answers:


248

这是官方命名约定文件规定的内容:

配套

独特的包名的前缀总是全部小写的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

以下摘录也很重要:

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

  • 如果域名包含连字符或标识符中不允许的任何其他特殊字符,请将其转换为下划线。
  • 如果结果包名称的任何组成部分是关键字,则在它们后面加上下划线。
  • 如果任何结果包名称组件以数字开头,或者任何其他不允许作为标识符的初始字符的字符开头,则在组件的前缀下划线。

参考文献


52
7.7章甚至建议在软件包名称中使用下划线!
Andreas Dolk


6
此处:oracle.com/technetwork/java/codeconventions-135099.html表示全部降低,但是此处docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1表示认为第一个组件应为小写,也删除了大写单词分隔的示例。同样在这里:docs.oracle.com/javase/tutorial/java/package/namingpkgs.html表示全部为小写。因此,目前不建议使用包名中的大写字母。
2014年

27
7.7章不建议使用下划线,它建议用下划线替换特殊/无效符号,这与仅推荐常规用法相去甚远。
eduard.dudar

270

这三个都不是惯例。

使用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程序包名称


9
我部分同意-根据Java命名约定,它们不是“错误的”,但在我看来,不应使用它们。(java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
安德烈亚斯多克

@Andreas_D您提供指出:“一个独特的包名的前缀总是全部小写的ASCII字母”链接
何塞·戈麦斯

1
@JoseGómez“ 前缀 ”。因此,恕我直言,这并不排除其他所有包含软件包名称的单词都来自CamelCase或snake_case
Antek,

21

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

任何人都不应使用连字符- (它的坏的做法)

没人可以在包裹名称中使用大写字母(错误做法)

注意:此处的“不良做法”是指从技术上讲,您可以使用该做法,但按惯例,这样做的方式不好。

资料来源:命名套件(docs.oracle)


47
是的,使用连字符是不好的做法,因为这是一个错误。编写不编译的代码确实是一种不好的做法。
glglgl

良好的链接-当您知道消息来源所说的内容时,有助于为所有这些提供一些上下文。我也习惯了所有小写的约定。但是根据文档,看起来这只是选择/样式问题。我在询问有关骆驼包名称的特定帖子中添加了评论(我不认为这是这篇帖子的重复,btw-只是询问一般的约定) stackoverflow.com/questions/36755783/…
Gene Bo

“没有大写字母”,尽管我同意所有大写字母或类似ClassName的名称是个坏主意,但它也消除了此Example。说“这是不好的做法”是我能想到的最令人信服,最模糊和最没有意义的理由。可以详细说明吗?(即定义“不良做法”)
Manius

您基本上还是在说“不好”,而没有给出为什么应该认为它不好的理由。它会破坏工具吗?造成混乱?难于阅读或打字吗?对于给出的示例,我认为我们可以对许多示例回答是。但是我不明白绝对禁止使用大写字母。程序包名称LikeThis(类似于类名)显然令人困惑,但是likeThis对我来说并不令人困惑,对于像bigdataSource(与“ bigdatasource”)这样的两个单词的程序包名称而言,可读性更高。除非出于某种原因,否则camelCase对于我不知道的软件包是一个坏主意,这似乎很好。
Manius

原来我错过了这一点:oracle.com/technetwork/java/codeconventions-135099.html 所有小写​​字母都是Oracle软件包名称约定的一部分。我仍然认为这是一个相当糟糕的约定,用于排除骆驼字母开头较低的情况,因为在那些(罕见)次数中,当您需要使用两个单词的程序包名称时,将其设置为两个目录没有任何意义。但是,哦。
Manius

18

官方的命名约定不是那么严格,除了前缀(com在您的示例中)之外,它们甚至没有“禁止”驼峰大小写表示法。

但是我个人会避免使用大写字母和连字符,甚至是数字。我也会选择com.stackoverflow.mypackageBragboy建议的。

(包名中的连字符“-”不合法)

编辑

有趣的是-语言规范也有关于命名约定的内容。

第7.7章“唯一程序包名称”中,我们看到带有由大写字母组成的程序包名称的示例(这样CamelCase表示法就可以了),并且建议用下划线(“ mary-lou”->“ mary_lou”)替换hyphonion,并使用前缀java带下划线的关键字(“ com.example.enum”->“ com.example._enum”)

有关软件包名称中大写字母的更多示例,请参见章节6.8.1软件包名称


2
正如Andreas指出的那样,在包名称中没有使用大写字母的规则。避免这种情况的一个特定原因是,我已经看到人们在进行跨平台开发时遇到了混合大小写的程序包名称问题。尤其是当有人决定重新命名或改变包装的情况下,你再依靠双方的VCS和开发环境做正好与目录的情况下正确的事情。
Shorn

2
事实上,也有规则:“一个独特的包名的前缀总是全部小写的ASCII字母”(oracle.com/technetwork/java/codeconventions-135099.html
何塞·戈麦斯

4

下划线在程序包名称中看起来很难看。出于价值考虑,如果名称包含三个或三个以上的单词,我将使用缩写(例如:)com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo,然后在中记录包装目的package-info.java


4
仅通过查看包装名称就可能难以理解并且难以理解包装的内容
Vishal Akkalkote

1
很公平。这就是为什么我建议使用文档的原因。我会随时使用此方法,而不是使用串联的完整单词(apiratesheet-是“ API Rate Sheet”还是“ A Pirate Sheet”?)
jpangamarca,

1

包名称中的单词串联是大多数开发人员不愿意做的事情。

您可以使用类似的东西。

com.stackoverflow.mypackage

请参阅JLS名称声明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.