包的定义
Java中包的概念类似文件夹,有名字,有层级,可以存放任何文件在某个文件夹下。在Java中,包管理的对象主要是类,使用包可以将代码按照自己的管理约定进行管理。同一包下类名不可相同,但是可以在不同的包下存在类名相同的类。
作用域
类、类成员的访问权限修饰决定了类的作用域,全局可见、包可见、继承可见、私有等。
包命名
Java中有这样的习惯,包层级开始由所属组织(公司)的官网网站的域名反转命名,比如谷歌google.com,反转后的包名com.google,包层级之间使用"."分隔,com表示最上层包,google表示第二级,以此类推。包创建好,可以在该包下创建相关的类及其他资源了。
以上简短的包名可以认为即将包含在该包层级下的代码属于哪个组织,然后根据业务领域在细分各个包,比如com.google.game,com.google.map等。还有一些其他的习惯,具体到了Java语言、约定等。比如需要和数据库表做映射的类放在pojo包下,接口实现类放在impl包下等等。
假设,某个模块A有这样的包com.google.entity,某个通用模块B也有com.google.entity,某个时候A需要用到B,这俩包要是出现同名类,要修改哪一个呢?改B模块下的类名?那所有依赖B的代码都需要复盘。按领域划分,视频服务的包可设计为 com.google.video.**.entity。
特别是微服务架构系统,没有约定时,引入其他"通用"代码就是互相折磨。
包与jar
Java提供的对代码归档的工具,将代码打包为jar文件,java语言的类库也是如此。基于此,如果系统需要某个模块,而该模块已经可以jar包的形式接入,提升了扩展性。
在自己的单体项目中,可能不需要担心类或者其他资源的层级之间的问题,基本都是开放的,随处都能获取。如果项目是当作组件使用,包层级相同时资源就不存在隔离。这里有一个Seal(密封,封存)的概念,可以针对jar内特定包层级进行限定,在mf文件中,指出一个包是否是密封的。如果将包标记为密封的,则归档的jar中应包含该包下所有的类,不可在该jar的外部定义相同的包及内容。
举例,com.abc是jar中的一个顶层包,但是mf文件中对该包标记了密封,该包下的所有子级都会是密封的,如果我要创建一个com.abc.util的包,这是不允许的,被密封的包表示jar中的该包应当是设计妥当,该有的东西都有了,才被密封。