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

Posted

技术标签:

【中文标题】Java包名称中单词分隔符的约定是啥?【英文标题】:What is the convention for word separator in Java package names?Java包名称中单词分隔符的约定是什么? 【发布时间】:2011-03-11 21:20:09 【问题描述】:

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

    com.***.my_packageSnake Case 使用下划线) com.***.my-packageKebab Case 使用连字符) com.***.myPackage (Camel Case) com.***.MyPackage (Pascal Case)

一般标准是什么?

【问题讨论】:

另一个尚未提及的示例是使用句点:com.***.my.package (2) 不是合法的 Java。不清楚你为什么要问这个问题。 请注意,所有这些只是为了确保唯一性。唯一实际强制执行的是远离 java.* 空间。 【参考方案1】:

这三个都不是约定。

使用com.***.mypackage

包名不遵循驼峰式或下划线或连字符package naming convention。

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

5.2.1 包名

包名都是小写的,连续的单词简单地连接在一起(没有下划线)。例如,com.example.deepspacenot com.example.deepSpacecom.example.deep_space

——Google Java Style Guide: 5.2 Rules by identifier type: 5.2.1 Package names.

【讨论】:

我部分同意 - 根据 java 命名约定,它们并没有“错误”,但我认为它们不应该被使用。 (java.sun.com/docs/codeconv/html/CodeConventions.doc8.html) @Andreas_D 您提供的链接指出“唯一包名称的前缀始终以全小写 ASCII 字母书写” @JoseGómez “前缀”。所以恕我直言,这并不排除包含包名称的所有其他单词是 CamelCase 或 snake_case 我一直遵循这个约定。但是,可读性确实不是很好。全部小写的原因是什么? Java 包命名约定页面中建议使用下划线,并在答案中链接。例如:“org.example.hyphenated_name”【参考方案2】:

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

唯一包名的前缀总是用全小写的ASCII字母写的,应该是***域名之一,目前是comedugovmil、@987654332 @、org 或 ISO 标准 3166, 1981 中指定的用于标识国家/地区的英文双字母代码之一。

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

示例

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

参考文献

java.sun.com - Code Conventions/Naming

请特别注意,***域前缀之后的任何内容均未在上述文档中指定。 JLS 也同意这一点,举了以下例子:

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

以下摘录也是相关的:

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

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

参考文献

JLS 6.1 Package Names

【讨论】:

第 7.7 章甚至建议在包名中使用下划线! 更新参考:docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.1(不再有 6.8.1 和 7.7) 这里: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 它表示全小写。因此,目前不鼓励在包名称中使用大写。 第 7.7 章不建议使用下划线,它建议用下划线替换特殊/无效符号,这远非仅推荐用于一般用途。【参考方案3】:

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

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

任何人都不应该在包名中使用大写字母(不好的做法)

注意:这里的“Bad Practice”是指从技术上讲你可以使用它,但通常它的写作方式并不好。

来源:Naming a Package(docs.oracle)

【讨论】:

是的,使用连字符是不好的做法,因为这是一个错误。而且编写不能编译的代码确实是不好的做法。 良好的链接 - 当您知道来源所说的内容时,有助于为所有这些提供一些背景信息。我也习惯于所有小写约定。但根据文档,看起来这只是一个选择/风格的问题。我在特定帖子中添加了一条评论,询问关于包名称的驼峰式大小写 (我认为这不是这篇帖子的重复,顺便说一句 - 它只是询问一般的约定) @987654323 @ “没有大写字母”,虽然我同意所有大写字母或看起来像 ClassName 的东西是一个坏主意,但它也消除了这个示例。说“这是不好的做法”是我能想到的最没有说服力、最模糊和毫无意义的理由。这可以详细说明吗? (即定义“不良做法”) 您基本上仍然在说“它很糟糕”,而没有说明为什么应该将其视为糟糕的理由。它会破坏工具吗?制造混乱?阅读或打字更难吗?对于给出的例子,我认为我们可以对其中的许多回答是肯定的。但我无法理解对大写字母的绝对禁令。包名 LikeThis (如类名)显然令人困惑,但 likeThis 对我来说并不令人困惑,并且对于像 bigdataSource (与“bigdatasource”)这样的两个词包名来说似乎更具可读性。除非出于某种原因,camelCase 对于我不知道的包来说是个坏主意,否则这似乎很好。 原来我错过了这个:oracle.com/technetwork/java/codeconventions-135099.html 所有小写字母都是 Oracle 包名称约定的一部分。我仍然认为这是一个相当糟糕的约定来排除开始较低的驼峰式大小写,因为那些(很少)需要使用两个单词的包名称并且将其设置为两个目录没有意义。但是哦,好吧。【参考方案4】:

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

但我个人会避免使用大写字母和连字符,甚至是数字。我也会像 Bragboy 建议的那样选择 com.***.mypackage

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

编辑

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

在Chapter 7.7 Unique Package Names 中,我们看到包名称由大写字母组成的示例(因此 CamelCase 表示法可以),他们建议用下划线(“mary-lou”->“mary_lou”)和前缀替换连字符带下划线的 java 关键字 ("com.example.enum" -> "com.example._enum")

更多包名中大写字母的例子可以在6.8.1 Package Names章节中找到。

【讨论】:

正如 Andreas 所指出的,没有关于在包名称中使用大写字母的规则。避免它的一个具体原因是我看到人们在进行跨平台开发时遇到混合大小写包名称的问题。尤其是当有人决定重命名或更改包的大小写时,您将依赖 VCS 和开发环境来完全对目录大小写做正确的事情。 其实是有规则的:“唯一包名的前缀总是全小写的ASCII字母”(oracle.com/technetwork/java/codeconventions-135099.html)【参考方案5】:

下划线在包名中看起来很难看。值得一提的是,如果名称由三个或更多单词组成,我会使用首字母缩写(例如:com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo),然后在 package-info.java 中记录包装用途。

【讨论】:

这可能不可读并且仅通过查看包名称很难理解包的内容 很公平。这就是为什么我建议使用文档。我会随时使用这种方法,而不是连接完整的单词(apiratesheet - 是“API Rate Sheet”还是“A Pirate Sheet”?)【参考方案6】:

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

你可以使用类似的东西。

com.***.mypackage

参考JLS Name Declaration

【讨论】:

【参考方案7】:

域名倒序

反向域名表示法(或反向 DNS)是编程语言、系统或框架使用的组件、包、类型或文件名的命名约定。反向 DNS 字符串基于注册的域名,为了分组目的,组件的顺序颠倒了。例如,如果制造产品“MyProduct”的公司的域名为 example.com,他们可以使用反向 DNS 字符串 com.example.MyProduct 作为该产品的标识符。反向 DNS 名称是消除命名空间冲突的一种简单方法,因为任何域名对其注册所有者都是全局唯一的。

命名包

随着世界各地的程序员使用 Java 编程语言编写类和接口,很可能许多程序员会为不同的类型使用相同的名称。事实上,前面的例子就是这样做的:当已经有一个 Rectangle 类时,它定义了一个

除非两个独立的程序员为他们的包使用相同的名称,否则这很有效。是什么阻止了这个问题?公约。

命名约定

[]

https://www.scientecheasy.com/2020/06/packages-in-java.html/

Java packages com and org

https://en.wikipedia.org/wiki/Reverse_domain_name_notation#:~:text=Reverse%20domain%20name%20notation%20(或,components%20reversed%20for%20grouping%20purposes。

http://www.wellnwill.com/tutorial/core-java/package/package-convention https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

【讨论】:

以上是关于Java包名称中单词分隔符的约定是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 Java 字符串从全部大写(由下划线分隔的单词)转换为 CamelCase(无单词分隔符)的最简单方法是啥?

在分隔符是单词的Java中拆分字符串

智一科技 约定 mysql

Java - 如果单词以用户输入的分隔符结尾,则执行 x

如何在Java中使用分隔符在所有大写单词之后拆分字符串?

Java - 正则表达式拆分输入文本但保留分隔符[重复]