java包结构的反向域名有什么意义

为什么我们使用像com.something这样的反向域名。 或者org.something。 java包的结构? 我知道这带来了某种独特性,但为什么我们需要这种独特性呢?

全局唯一的包名称可避免命名来自不同来源的库之间的冲突。 使用域名注册表而不是创建全局名称的新中央数据库。 来自JLS:

用于生成唯一包名称的建议约定仅仅是在现有的,广为人知的唯一名称注册表之上搭载包命名约定的方法,而不是必须为包名称创建单独的注册表。

关于我们为什么要逆转:想象一下,你有两个重要的包,一个会计包和一个图形包。 如果您以“直接”顺序指定了这些:

accounting.mycompany.org graphics.mycompany.org 

然后它意味着有一个主要的accounting软件包,其子部分用于mycompany软件包的子部分称为您实际使用的org包。 但是,你想要这个:

 org.mycompany.accounting org.mycompany.graphics 

这更有意义。 在组织( org )的所有包中,你特别关注mycompany ,它有两个子包,即accountinggraphics

正如您所说,反向域名作为基本包名称可确保唯一性。 假设DN example.com和example.org的两家公司都在其框架中定义了Employee类。 现在,如果您使用这两个框架,您将无法确定要在代码中使用哪个Employee,但如果它们分别在com.example和org.example包中定义,您可以告诉编译器/ JVM具体是哪个类。提到。 如果未定义唯一包,则会出现编译错误或运行时错误,例如,如果您使用的是com员工类,但是首先从类路径加载org employee类会导致运行时错误,因为这两个员工类可能不会具有相同的结构。

Class Loading需要唯一性。

它有助于避免命名冲突。 如果存在具有相同包名和类名的类,则在尝试加载类时将发生冲突。

如果有多个库(jar)包含具有相同名称的类,则通常会发生这种情况。

也看到这个 。

如果您可能需要将代码与第三方软件集成,或者将其提供给其他人进行集成,则需要具有唯一性。 如果您不遵守规则,则会增加在某些时候您将发生类命名冲突的风险,并且您需要重命名许多类来解决它。 或者更糟糕的是,您的客户将不得不进行代码重命名。

当代码作为组织中不同项目的一部分生成时,这也适用。

正如您所说,它带来了独特性,特别是在使用第三方代码时需要的东西。 例如,假设您使用的是我制作的库。 我使用了包“foo”并在那里有一个名为Bar的类。 现在,如果您还使用包名“foo”并且您有一个名为Bar的类,这将意味着您的实现将覆盖我的Bar实现,使我的实现无法访问。 另一方面,如果我的包是“com.mydomain.foo”并且我在那里有Bar类,那么你可以在你的一个类中自由使用名称Bar,这两个类仍然可以被唯一标识并单独使用。

为什么使用反向域名作为包名? 我想这只是一个确保每个人都使用唯一命名空间的约定,因为你不应该在你的包名中使用别人的域名。