Java包名中的分隔符是什么?

包名中应该如何分开单词? 以下哪项是正确的?

  1. com.stackoverflow.my_package (下划线)
  2. com.stackoverflow.my-package (hypens)
  3. com.stackoverflow.MyPackage (camel-case)

通用标准是什么?

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

唯一软件包名称的前缀总是以全小写ASCII字母编写,并且应该是顶级域名之一,当前是comedugovmilnetorg ,或者是英文双字母代码之一识别1981年ISO标准3166中规定的国家。

包名称的后续组件根据组织自己的内部命名约定而有所不同。 这样的约定可能会指定某些目录名称组件是分区,部门,项目,机器或login名称。

例子

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

参考

  • java.sun.com – 代码约定/命名

请注意,特别是,顶级域名前缀之后的任何内容都没有被上面的文档指定。 JLS也同意这个例子:

  • com.sun.sunsoft.DOE
  • gov.whitehouse.socks.mousefinder
  • com.JavaSoft.jag.Oak
  • org.npr.pledge.driver
  • uk.ac.city.rugby.game

以下摘录也是相关的:

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

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

参考

  • JLS 6.8.1包名称
  • JLS 7.7独特的软件包名称

这三个都不是公约。

使用com.stackoverflow.mypackage

软件包名称不遵循骆驼套或下划线或连字符包的命名约定 。

另外, Google Java Style Guide指定了完全相同的(即com.stackoverflow.mypackage )约定:

5.2.1包名称

软件包名称全部是小写字母,连续的单词连接在一起(没有下划线)。 例如, com.example.deepspace而不是 com.example.deepSpacecom.example.deep_space

– Google Java Style Guide:5.2按标识符types的规则:5.2.1包名 。

官方的命名规则并不是那么严格,除了前缀(在你的例子中是com )之外,他们甚至都不会“禁止”骆驼情况符号。

但我个人会避免大写字母和连字符 ,甚至数字。 我会select像Bragboy一样的com.stackoverflow.mypackage。

(连字符“ – ”在包名中不合法)

编辑

有趣的是,语言规范也有关于命名约定的说法。

在第7.7章独特的软件包名称中,我们看到包名称由大写字母组成的例子(所以CamelCase符号可以),他们build议用下划线(“mary-lou” – >“mary_lou”)replacehyphonation,前缀java带有下划线的关键字(“com.example.enum” – >“com.example._enum”)

包名中的大写字母的更多示例可以在章节6.8.1包名中find 。

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

没有人应该使用hypen (它的坏习惯)

没有人应该使用包名内的大写字母(坏习惯)

来源: 命名一个包(docs.oracle)

包名中的单词连接是大多数开发人员不能做的事情。

你可以使用类似的东西。

com.stackoverflow.mypackage

请参阅JLS名称声明

我宁愿使用单个单词和子包,所以,而不是说com.stackoverflow.my包,我会使它com.stackoverflow.my.package

这为将来添加与您的父包相关的子包打开了机会。 参考: http : //programmergate.com/coding-conventions/

下划线在包名中看起来很丑。 值得一提的是,如果是三个或三个以上单词的复合词,我使用首字母(例如: com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo ),然后logging包装目的在package-info.java。