2009-01-07 194 views
9

我刚刚为Java SE提供了学习曲线&对于软件包名称的常规Java约定(例如, com.example.library_name_here.package_name_hereJava软件包名称约定失败

除外。

我一直在注意到在一些相当知名的软件包中没有遵守这一点。

  • JLinejline.*
  • JACOBcom.jacob.*(没有jacob.com)
  • JNAcom.sun.jna.*(网站上的声明说注:太阳不赞助这个项目,即使包名( )

所以我想知道,是否有通常反向域名约定中断的情况下,有g它的方式来解决它?我能想到的唯一情况是围绕域名所有权问题(例如,您更改了项目托管/域名,或者已经有一个知名的软件包对您的域拥有“擅自占有权”,或者您拥有域出&别人把它收起来)。

编辑:如果我使用我公司的域名,并且我们被收购或分拆,我们应该如何处理包名?保持不变或重命名? (我认为重命名是不好的,因为编译指向包的类会丢失)

+0

JUnit曾经犯过同样的错误,但在Junit 4中修正了它(同时为了向后兼容性而在旧包中保留了一些类) – 2009-01-07 16:28:41

回答

2

软件包用于避免由各种实体构建的组件之间的不明确性和冲突。只要你遵守约定,并且没有人非法使用你的包命名空间派的片断,你不应该担心别人使用了什么。

2

唯一重要的事情是(IMHO),包名的部分按重要性“排序”,即你不会以gui.myprog,util.myprog,main.myprog结尾,而是使用myprog.gui,myprog.util和myprog.main。包名是否真正以顶级域名后跟一个域名开头对我来说无关紧要。

+1

实际上,重要的是它们不会相互碰撞,因此您必须声明一些在名字上。使用Jline *是不健康的,因为如果其他人很愚蠢,你的申请不能一起使用。 – 2009-01-07 18:15:41

12

这是一个命名约定。没有真正的要求,甚至不希望软件包名称映射到域名。

+2

但是,有一个非常强烈的建议。 – 2009-01-07 16:32:16

+1

@sblundy,不,实际上,它绝对存在*期望*(不要求),它映射到域名。没有人会看到com.name.product,并考虑是否是name.com或name.org(公司)。他们(我们都)假设name.com。 – 2015-01-25 20:20:12

1

你无法用语言的关键字作为包名的一部分,这就是域名约定不能适用另一种情况 - 倒霉的LONG Building Technologies

但随后,该公约是仅仅是一个惯例,几乎所有存在的唯一原因是它最大限度地减少了不同项目意外选择相同包名的机会。如果你不能遵循它,这不是一个真正的大问题。

5

总体思路是两个组织不会拥有相同的域,因此将域名用作包的一部分可确保不存在名称空间冲突。但这只是一个建议。

有人有一个很好的理由让软件包在sun名称空间中。如果他们提供公共API的实现,通常需要在API的名称空间中实现这些类。

3

如果您正在通过Java学习曲线,我会更加关注如何使您的包装结构变得清晰,以便您可以轻松找到所需的课程。