我见过许多例如com.mycompany.someapp
的例子。似乎是域的反面。这对我来说真的很有意义。
但是在一天结束时,这真的很重要吗?我们是一家小商店,所以也许我们没有看到正确域名命名的好处。
那么,将它命名为与域匹配是一种好习惯吗?如果是这样,为什么?
答案 0 :(得分:9)
摘自安德鲁评论中Naming a Package (Java Tutorial)的链接:(我声称没有以下原创性或所有权。)
随着世界各地的程序员使用Java编程语言编写类和接口,许多程序员很可能会为不同的类型使用相同的名称。事实上,前面的例子就是这样:它定义了当java.awt包中已有Rectangle类时的Rectangle类。尽管如此,编译器允许两个类在不同的包中具有相同的名称。每个Rectangle类的完全限定名称包括包名称。也就是说,图形包中Rectangle类的完全限定名是graphics.Rectangle,java.awt包中Rectangle类的完全限定名是java.awt.Rectangle。
除非两个独立的程序员为他们的包使用相同的名称,否则这很有效。是什么阻止了这个问题?
包名称以全小写编写,以避免与类或接口的名称冲突。
公司使用[他们的]反向互联网域名来开始他们的包名称 - 例如,com.example.mypackage,用于由example.com的程序员创建的名为mypackage的包。
名称在单个公司内发生的冲突需要在该公司内按惯例处理,可能是在公司名称后面包含区域或项目名称(例如,com。 example.region.mypackage)。
Java语言本身的包以java开头。或javax。
在某些情况下,互联网域名可能不是有效的包名。如果域名包含连字符或其他特殊字符,如果包名称以数字或其他非法用作Java名称开头的字符开头,或者包名称包含保留的Java关键字,则会发生这种情况,例如“int”。在这种情况下,建议的约定是添加下划线。例如:
Legalizing Package Names Domain Name Package Name Prefix hyphenated-name.example.org org.example.hyphenated_name example.int int_.example 123name.example.com com.example._123name
快乐的编码。
答案 1 :(得分:6)
匹配域可以提高您对名称冲突的信心。对于第三方图书馆的设计者而言,这可能比您和您的应用程序更重要。
答案 2 :(得分:4)
是的,这是Java Language Specification, section 7.7中建议的约定。
如果未使用唯一的包名称,那么包名称冲突可能远远超出任何冲突包的创建点。这可能会造成用户或程序员难以或不可能解决的情况。在包有约束交互的情况下,类ClassLoader可用于隔离具有相同名称的包,但不能以对初始程序透明的方式隔离。
您首先拥有(或属于拥有)互联网域名的组织(例如sun.com),从而形成唯一的包名称。然后,逐个组件地反转此名称,以获取(在此示例中为com.sun),并使用此作为包名称的前缀,使用组织内部开发的约定来进一步管理包名称。
你没有拥有来遵守惯例,但它通常被认为是一种良好的做法。毕竟,假设在将来某个时候你想要将一些代码作为开源发布 - 但是你想避免命名冲突。那时,你真的应该遵循与其他人相同的约定 - 因为从一开始就没有伤害这样做......
答案 3 :(得分:0)
使用域名的想法是避免打包中的命名空间冲突。这只适用于每个人都遵循惯例的情况。所以,是的,这个惯例很重要。也就是说,如果您从未打算将您的代码导出为API或将其提供给第三方,那么使用您喜欢的任何软件包名称可能没有什么不足之处。
答案 4 :(得分:0)
实际上我喜欢它有很多原因:
除此之外,还建议JLS。这不是一个要求,但是当它几乎没有努力的时候,除非有充分的理由,否则我会这样做。
或许更好的问题是为什么不你想遵循这个惯例?如果没有真正的理由,遵循它是没有害处的!
答案 5 :(得分:0)
主要目的是保证软件包名称的唯一性,但是如果你永远不会发布其他人使用的代码那么它可能并不重要,但是要坚持常规和担心还有很多要说的关于重要的事情。否则,如果你意识到自己拥有一个想要分享的优秀图书馆的那一天,那么你可能会因为逆流而自责。
答案 6 :(得分:0)
是的,总是使用命名方案是明智的。作为一个反例,假设每个人都会使用默认包作为他们的类。
多个库将使用诸如User
或Address
之类的公共类,但最终在运行时环境中只能有一个特定名称的类。 (松散地说,这不完全正确。)
在大型项目中,您可能会使用许多外部库,如Apache Commons,Google Guava,Spring,Hibernate,Terracotta。这些库都使用自己的命名空间是好的,这样它们的内部类就不会意外冲突。