【问题标题】:java package name convention failurejava包名称约定失败
【发布时间】:2009-01-07 16:18:40
【问题描述】:

我刚刚开始学习 Java SE,并且对通常的 Java 包名称约定没有问题,例如com.example.library_name_here.package_name_here

除了。

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

  • JLine: jline.*
  • JACOB:com.jacob.*(没有jacob.com)
  • JNA: com.sun.jna.*(网站上的免责声明说注意:Sun 不赞助这个项目,即使包名 (com.sun.jna) 可能暗示其他情况。)

所以我想知道,是否存在通常的反向域名约定被破坏的情况,并且有很好的方法来解决它?我能想到的唯一情况是围绕域名所有权问题(例如,您更改项目托管/域名,或者已经有一个众所周知的包对您的域具有“抢注权”,或者您对域的所有权运行出去 & 别人抢购它)。

编辑:如果我使用我公司的域名,我们被收购或分拆,我们应该如何处理包名?保持它们相同或重命名? (我认为从引用包的编译类然后丢失的角度来看重命名是不好的)

【问题讨论】:

  • JUnit 曾经犯过同样的错误,但在 Junit 4 中修复了它(同时仍将一些类保留在旧包中以实现向后兼容性)

标签: java naming-conventions


【解决方案1】:

这是一个命名约定。没有真正的要求甚至期望包名映射到域名。

【讨论】:

  • 不过,有一个非常强烈的建议。
  • @sblundy,不,实际上,绝对有一个 期望(不是要求)它映射到一个域名。没有人看到 com.name.product 会考虑它是 name.com 还是 name.org(公司)。他们(我们都)假设 name.com。
【解决方案2】:

一般的想法是两个组织不会拥有同一个域,因此将域名用作包的一部分可确保没有命名空间冲突。然而,这只是一个建议。

有人在 sun 命名空间中拥有包是有充分理由的。如果他们提供公共 API 的实现,通常需要在 API 的命名空间中实现类。

【讨论】:

  • 你能提供这方面的例子吗?我是 Java 领域的新手,但总的来说(不一定是 Java)我看不出一个实现应该与 API 位于同一命名空间中的逻辑原因。
【解决方案3】:

如果您正在逐步提升 Java 学习曲线,我会更担心使您的打包结构清晰,以便您可以轻松找到所需的类。

【讨论】:

    【解决方案4】:

    包用于避免由各种实体构建的组件之间的歧义和冲突。只要您遵守约定,并且没有人非法使用您的包命名空间派,您就不必担心其他人使用了什么。

    【讨论】:

      【解决方案5】:

      唯一重要的事情(恕我直言)是包名的各个部分按重要性“排序”,即您不会以 gui.myprog、util.myprog、main.myprog 结尾,而是以 myprog 结尾。 gui、myprog.util 和 myprog.main。包名是否真的以顶级域开头,后跟域名与我无关。

      【讨论】:

      • 实际上,重要的是它们不会发生冲突,因此您必须对名称有一些要求。使用 Jline.* 是不健康的,因为如果其他人那么愚蠢,您的应用程序就无法一起使用。
      【解决方案6】:

      您不能将语言关键字用作包名称的一部分,这是无法应用域名约定的另一种情况 - LONG Building Technologies 运气不好

      但是,约定就是这样,约定,它存在的唯一原因是它最大限度地减少了不同项目意外选择相同包名称的可能性。如果你跟不上,那也不是什么大问题。

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 2011-09-10
        • 2012-01-04
        • 2019-11-10
        • 1970-01-01
        • 2018-09-28
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多