今天在看Java提供的NIO源码时,偶然看到该包下很多Java类没有加public限定符。
并且特意加上了 package-private ——包私有的注释。
回想一下,Java默认的对象作用于域确实是包私有。
包私有的概念
1、一个对象可被该对象所在包对象所引用,且不需要加 import ;
2、该对象不可被该对象所在外部包或子包所引用;
比如我在包privatepackage下新建包私有对象C:
在包privatepackage下新建对象A
在包privatepackage.b下新建对象B
此时我在对象A中可引用对象C,idea的代码提示很明显的表明这一点:
而在对象B中,是无法引用对象C的:
相信到这里你已经很清楚包私有对象是怎么一回事了,那么包私有对象有什么用?实际上很少人用到,如果不是今天偶然看到Java Nio下的源代码,我都要误以为 class 关键字前必须加上 public 关键字了,毕竟 idea 创建对象的时候,默认就会加上 public 关键字。
个人觉得,包私有对象,可以存在以下几种场景:
1、对接多个外部接口,对于类似的业务,实际上出入参数是类似但又不完全一样的。那么这种时候一个外部渠道定义一个包,该包下的请求参数就可以定义为包私有类型,虽然实际业务中我们是会加上不同的前缀和后缀。
2、作为接口提供方,不能被三方使用的对象。比如你写了个转换工具类,可以被其他团队使用,为了保证工具类的安全和健壮,有些元数据类不能被修改使用,也可以定义为包私有。