Java 包名规范错误

9

我正在学习Java SE,对于包名的惯例,如com.example.library_name_here.package_name_here,没有任何问题。

但是。

我注意到一些相当著名的软件包未遵守这个惯例。

  • JLinejline.*
  • JACOBcom.jacob.*(没有jacob.com)
  • JNAcom.sun.jna.*(网站免责声明中说:请注意:尽管包名称(com.sun.jna)可能暗示其他情况,Sun并未赞助此项目。)
我在想,常规的反向域名约定是否存在例外情况?是否有良好的解决方法?我能想到的唯一情况是围绕域名所有权问题(例如更改项目托管/域名,或者已有一个享有“抢注权”的知名软件包使用您的域名,或者您的域名所有权到期并被他人接手)。编辑:如果我使用公司的域名,并被收购或分拆,我们应该如何处理软件包名称?保持不变还是重命名?(我认为从引用软件包的编译类的角度来看,重新命名是不好的)

JUnit曾经犯过同样的错误,但在JUnit 4中进行了修复(同时仍保留一些旧包中的类以实现向后兼容)。 - Joachim Sauer
6个回答

12

这是一种命名约定。实际上并没有要求,甚至也没有期望包名映射到域名。


2
然而,这里有一个非常强烈的建议。 - Joachim Sauer
1
@sblundy,实际上,绝对有一个期望(而不是要求)它映射到一个域名。没有人看到com.name.product并考虑一秒钟它是name.com还是name.org(公司)。他们(我们所有人)都假设是name.com。 - user4229245

5

一般来说,两个组织不会拥有相同的域名,因此在包的命名中使用域名可以确保避免名称空间冲突。但这只是一个建议。

如果某人提供公共API的实现,则将其包放在sun命名空间下是有好处的。因为通常需要在API的命名空间中实现类。


你能提供一些例子吗?我对Java不是很熟悉,但通常情况下(不一定是在Java中),我看不出为什么实现必须与API在同一个命名空间中。 - monkey0506

3
如果你正在学习Java,我建议你更关注如何清晰地组织你的包结构,这样你就能轻松找到你需要的类。

2

软件包用于避免不同实体构建的组件之间的歧义和冲突。只要您遵循惯例,并且没有人非法使用您的软件包命名空间,您就不需要担心其他人所使用的内容。


1
在我看来,唯一重要的事情是包名的各个部分按照重要性进行“排序”,即你不应该以gui.myprog、util.myprog、main.myprog结尾,而应该以myprog.gui、myprog.util和myprog.main结尾。包名是否真的以顶级域名开头,后跟域名对我来说并不重要。

1
实际上,重要的是它们不发生冲突,因此您必须对名称进行某些声明。使用 Jline.* 是不健康的,因为如果其他人也这么愚蠢,那么您的应用程序不能一起使用。 - Bill K

1

你不能将语言关键字用作包名称的一部分,这是另一种情况下域名约定无法应用的情况 - 对于LONG Building Technologies来说很不幸。

但是,约定只是一个约定,它存在的主要原因就是为了最小化不同项目意外选择相同的包名称的几率。如果你无法遵循它,那么这并不是一个大问题。


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