根据编程思想中提到权限管理主要用于告诉他人或客户端,你可以直接使用我的哪些API,其实这也是很明确的,因为通信方式可能会改变而我们又不知道客户端使用了我们哪些接口,所以导致不能去修改我们的代码以至开发作者束手束尾。访问控制就是解决这个问题的(隐藏具体实现,因为我们也许可以找到更好的实现方式)例如我们对外提供public等,但是private就被我们隐藏掉了。
1、权限说明
说明:C(x)P(y)
表示类C(x)
所在包为P(y)
对于protected
方法所在C(i)P(j)
,那么新类C(k)P(v)
访问protected
方法分下面二种情况
1.1、v=j
同包或C(k)
是C(i)
的子类,类C(k)P(v)
可以访问C(i)P(j)
非继承而来的protected
方法,继承而来的方法可能会访问不了如情况2所述。
1.2、如果C(k)P(v)
继承C(i)P(j)
,新类C(k+1)P(v+1)
想访问C(k)P(v)
继承来的Protected
方法,必须v+1 = j
误区:假设类C(k)P(v)
是C(i)P(j)
的子类,那么在C(k)P(v)
中新建类C(i)P(j)
对象c(ij)
,如果v=j
那么c(ij)
对象可以访问自己的projects
方法,v != j
不在同一个包则不能访问。
2、分包的艺术
根据编程思想中提到权限管理主要用于告诉他人或客户端,你可以直接使用我的哪些API,其实这也是很明确的,因为通信方式可能会改变而我们又不知道客户端使用了我们哪些接口,所以导致不能去修改我们的代码以至开发作者束手束尾。访问控制就是解决这个问题的(隐藏具体实现,因为我们也许可以找到更好的实现方式)例如我们对外提供public等,但是private就被我们隐藏掉了。
2.1、为什么要分包?
包名唯一:因为我可以提供com.funzzz.StringUtils别人也有可能提供com.funzzz.StringUtils产生冲突导致错误,所以这里一般使用唯一域名作为包前缀。所以即便名为StringUtils的类通过import其具有的行为也会不同。
分包:这个主要用于我们代码管理。因为一个项目可能包含配置文件、数据模型、业务实现、接口提供等不同的业务逻辑,所以分为不同的层。分层组织源代码的好处也是显而易见的,简洁、逻辑清晰,职责单一,阅读性强。
一个大型项目(JDK开发)可能每个包都由多位开发人员进行开发,一组开发人员开发一个包,所以基于安全考虑包小组经常给包内提供一些可用的类,而其它包无法进行使用,或者部分较安全的包,也允许别的包进行使用。
注:同包是指com.funzzz.config.A com.funzzz.config.B,com.funzzz.config.spring.A和com.funzzz.config.B是不同包
2.2、public权限的必要
允许任意逻辑层随意访问,这就意味着public之后的成员和方法对每个人都是可用的开放的。带来的问题是开放过多public可能会导致滥用,架构层面设计不好的话很难进行修改。
2.3、protected权限的必要
包内成员访问,但是也允许包外访问,但是使用它的话需要继承它。为什么包外限制使用是采用子类形式呢?而且即使子类继承后使用依然有限制呢?
个人理解:
1、设计考虑给予包外使用权限,采用子类是一种实现方式而且好处是有的例如Object finalize()
对于这个方法一般是给类本身使用的,用于在gc时做些确保内存回收的事情。所以这类方法是比较隐私且与自己本身密切相关的,主要用于类内执行完某些操作后进行使用(例如确保垃圾释放),比较重要一点的是,外部包继承了该类后也应该去进行这些特殊的操作,所以子类应该具有这个方法。又由于这类操作比较隐私和重要,所以不允许不相干人员来操作例如包外类(非子类)开发人员。
2、为什么继承后继续加以限制?(1.2种所述)因为我们知道protected方法本身是比较隐私和重要的只有包内和包外子类才有权限控制。又因为客户端一定是在包外,所以给予客户端的权限是子类内部才可以操作自己继承而来的的protected方法。如果这个protected是你自己包小组开发,那么你包内就具有很大的权限如果是使用别人的protected方法,那么仅允许子类内部使用。
所以对于protected方法一般是类内重要和隐私的方法,包开发小组有权限进行操作,客户端仅仅子类有权限。
提示:类非static成员变量并且与子类共享,必须是protected。类成员方法只对继承类公开那么限制为protected.(阿里java开发守则)
2.4、default权限
只允许包内访问。开发本包人员可用。
2.5、private权限的存在
开发人员写了某个类认为这个某方法无需对外提供仅仅类内使用或为了数据安全防止类使用者随意修改数据而进行保护措施。
3、打破常规
java反射可以获得所有权限操作,同时意味着不安全,例如客户端反射调用包的某些私有方法,下次包作者更新该方法,可能导致客户端出错,这个就要看客户端自己的权衡了。
- 本文作者: 初心
- 本文链接: http://funzzz.fun/2020/12/30/java protected说明/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!