为什么Java包名应该小写?

80

实际上这只是一个理论问题。但是有趣的是,为什么Java规范不允许在包名中使用大写字母,导致我们需要像这样编写代码:

com.mycompany.projname.core.remotefilesystemsynchronization.*

替代

com.myCompanyName.projName.core.remoteFileSystemSynchronization.*

可能是Java包名中的单词分隔符惯例是什么?的重复问题。 - Martin Schröder
9
不是的,本文与那篇文章不重复,我关注的是这些惯例存在的原因。 - Oleksii Kolotylenko
3个回答

121

来自Oracle文档

为避免与类或接口的名称冲突,包名使用小写字母编写。


15
包名也常与文件系统目录结合使用,而文件系统目录本身往往有字符大小写限制。 - Will
15
谁会使用不支持大写字母的文件系统?你要么用的是ext3、NTFS或者苹果电脑上的那个东西,我们已经不再处于90年代了。 - Mike76
5
为了避免与类名混淆,您不能将com.site.myName与类名混淆,因为在类的情况下,应该是com.site.MyName(以大写字母开头)。因此,“myname”方法没有逻辑优势。我认为“myName”更好,因为它更易于阅读。例如,“com.marvel.movies.gardiansofthegalaxy”。 - JRr
3
在你的情况下,@joro所指出的AppName不是小驼峰命名法(lowerCamelCase)(如果是我,可能会扼死创建AppName的人,就像我想扼死我们公司创建以小写字母开头的类的人一样...)。我是开发者中认为com.pany.app.tableOfContents比com.pany.app.tableofcontents(或com.pany.app.toc)更易读的一员。而com.pany.app.table.of.contents则更糟糕... - Nedorot
实际上,Java规范中的示例打破了这个约定:在第6.6节中,您会发现package pointsUser作为一个示例。看起来它是作为一个后来的想法出现的(使用与函数和变量相同的约定也可以)。 - khaemuaset
显示剩余2条评论

43
但有趣的是,为什么Java规范不允许在包中使用大写字母,并导致编写像这样的内容:
规范完全允许。只是惯例要使用全小写。正如gtgaxiola所说,这确实避免了与类型名称的冲突...在.NET命名约定中,这确实会发生,导致建议不要将类命名为其命名空间相同。当然,使用驼峰式的包名将完全避免冲突。
我怀疑实际上在创建包命名约定时没有认真考虑过这一点。个人而言,我很少觉得这是个问题——如果我看到一个元素为“remotefilesystemsynchronization”的包,那么大小写并不是我最关心的事情 :)

没错,@Jon!同样适用于以大写字母开头的类名。 - gtgaxiola
所以基本上,一个以小写字母开头并且后面的单词都是大写字母(比如方法)的包子部分名称将不会与类发生冲突,只要它们都以大写字母开头,对吧?:) 但最重要的是,这将是唯一与之相关的问题冲突,因为我看不到一个包子部分名称会与方法名称发生冲突... - Aquarius Power
规范已经迁移到:https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces - Flimtix

1

这只是另一个约定 - 有人可能会问为什么类名总是以大写字母开头,而方法名则以小写字母开头然后使用驼峰式。Java并不强制你使用这种方式。只是一组下划线规则帮助Java程序员编写易于理解的代码,以满足遵循惯例的大多数开发者的需求。

没有明确的原因可以被指定。当时,大多数程序员在编写约定时觉得这样做很并且实践证明有效。但是在编写约定之前肯定会有指导方针。我并不是说这是一种任性的工作。制定指南是为了通过查看各种元素,我们应该能够告诉它是否为类、方法或包 - 并通过遵循惯例达到如此长久的效果。


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