为什么我们使用像com.something这样的反向域名。或者org.something。 java包的结构? 我知道这会带来某种独特性,但为什么我们需要这种独特性呢?
答案 0 :(得分:31)
关于我们为什么要这样做:想象一下,你有两个重要的包,一个会计包和一个图形包。如果您按“直接”顺序指定了这些:
accounting.mycompany.org
graphics.mycompany.org
然后它意味着有一个主要的accounting
包,其子部分用于mycompany
,的子部分包称为org
你实际使用的包裹。但是,你想要这个:
org.mycompany.accounting
org.mycompany.graphics
这更有意义。在组织(org
)的所有包中,您特别关注mycompany
,它有两个子包,accounting
和graphics
个子包。
答案 1 :(得分:30)
全球唯一的包名称可避免命名来自不同来源的库之间的冲突。使用域名注册表而不是创建全局名称的新中央数据库。来自JLS:
建议的惯例 生成唯一的包名称是 只是一种背包的方式 在...之上命名约定 现有的,广为人知的独特名称 注册表而不是必须创建一个 包名称的单独注册表。
答案 2 :(得分:4)
正如您所说,反向域名作为基础包名称可确保唯一性。假设DN example.com和example.org的两家公司都在其框架中定义了Employee类。现在,如果你使用这两个框架,你将无法确定你想在代码中使用哪个Employee,但如果它们分别在com.example和org.example包中定义,你可以告诉编译器/ JVM你具体是哪个类提到。如果未定义唯一包,则会出现编译错误或运行时错误,例如:如果您正在使用com employee类,但是首先从类路径加载组织雇员类,您将收到运行时错误,因为这两个雇员类可能没有相同的结构。
答案 3 :(得分:2)
Class Loading需要唯一性。
它有助于避免命名冲突。如果存在具有相同包名和类名的类,则在尝试加载类时会发生冲突。
如果有多个库(jar)包含具有相同名称的类,则通常会发生这种情况
另请参阅this。
答案 4 :(得分:0)
如果您可能需要将代码与第三方软件集成,或者将其提供给其他人进行集成,则需要具备唯一性。如果您不遵守规则,则会增加在某些时候您将发生类命名冲突的风险,并且您需要重命名许多类来解决它。或者更糟糕的是,您的客户将不得不重新命名代码。
当代码作为组织中不同项目的一部分生成时,这也适用。
答案 5 :(得分:0)
正如你所说,它带来了独特性,特别是在使用第三方代码时需要的东西。例如,假设您使用的是我制作的库。我使用了包“foo”并在那里有一个名为Bar的类。现在,如果您还使用包名“foo”并且您有一个名为Bar的类,这将意味着您的实现将覆盖我的Bar实现,使我的实现无法访问。另一方面,如果我的包是“com.mydomain.foo”并且我在那里使用了Bar类,那么你可以在你的一个类中自由使用名称Bar,这两个类仍然可以被唯一标识并单独使用
为什么使用反向域名作为包名?我想这只是一个约定,以确保每个人都使用唯一的命名空间,因为你不应该在你的包名中使用别人的域。