有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java包结构约定

我当时正在使用Typescript和Javascript,我停下来思考了一下名称空间,以及我们如何用Java组织代码

现在,我经常看到多个具有相同用途的类,只是用于不同的数据,被放在不同的包中,使用不同的名称

虽然将这些类放在不同的包中是保持项目/模块处于良好状态的一种好做法,但我们为什么要给它们取不同的名称呢?我是说,他们的目的是一样的

我可以自己回答这个问题:因为我们经常在同一个单元中使用这些类,它们会发生冲突,因此需要对其中一个进行长时间的完整包规范

但我们不是违反了干燥原则吗?我们应该使用目录(包)结构来理解这些类在哪个域空间中工作

正如我在上面所写的,我想许多开发人员不尊重这个枯燥的原则,只是为了避免长的包名。那么,我们为什么要创建那些monstruos包层次结构呢
谷歌搜索"Java packages best practices"会产生如下建议:

com.mycompany.myproduct.[...]

这些建议来自哪里?我们不是在浪费空间吗
显然,我们不想每次都这么写

MyClass myInstance;
com.mycompany.myproduct.mypackage.MyClass myOtherInstance;

但也有可能

myfeature.MyClass myInstance
myotherfeature.MyClass myInstance;

我们甚至可以为两者指定完整的软件包
那么,这些最佳实践来自哪里

如前所述,这个约定可以追溯到Java的第一个版本。 通过使用short包的层次结构来限定导入的依赖项(例如类路径库)类,强调并保持我们自己的代码的整洁,可以很容易地解决名称冲突。记住,我们可以访问包级别的可见性,这一点也很重要,现在似乎被忽略了


共 (1) 个答案

  1. # 1 楼答案

    正如一位评论者所指出的,这个约定是在Java的最开始建立的,它允许对所有类使用全局名称空间

    Java有一点影响了这一点,与TypeScript和JavaScript不同,类的名称及其包(以及它使用的所有类和包的名称)固定在编译时。如果不修改类的源代码,就无法将类重新组合到不同的层次结构中。因此,它不像解释式语言那样灵活,在解释式语言中,您可以随意移动层次结构,并更改加载代码的位置

    当然,您可以将应用程序中的所有内容都放在顶级软件包中,并且非常有信心能够成功。只要每个人都遵守现有的惯例,你就可以做到这一点。一旦它们停止这样做,库开始将类放在它们想放的任何地方,就会发生冲突,并且必须更改应用程序。或者库会开始相互冲突,如果你没有源代码,你就无法真正修复它

    所以有很好的理由

    我的观点是,坚持传统和语言(或平台)文化是有道理的。在我们看来,即使这些惯例很愚蠢。有一个打破它们的地方,但优势必须相当大。其他开发人员将习惯于该约定,工具将对该约定进行假设。。。通常顺其自然是有道理的

    对Java中的每个属性使用getter和setter真的有意义吗?如果你很了解你正在使用的领域,它很可能不会。但是停止这样做,你的代码对你团队的其他成员来说就没有意义了,你必须随着人们的加入不断地重新考虑这个决定,等等

    如果这是一个人的项目,而且永远都是,当然,你可以做你想做的事