java是开源的,三大特征之一就是封装,好的封装可以让开发者感到愉悦,坏的封装就不说了。一个模块的设计好与不好,封装显得特别重要。如果一个模块的细节全都在自己模块内部处理完毕,外部需要调用这个模块,只需要传入参数即可,不必自己又去调用内部的各个函数,进行逻辑判断;简单来说,模块内部隐藏细节,处理自己的逻辑,接收外部的参数,返回外部需要的结果,不麻烦外部做出额外的操作。它把细节和逻辑完全密封到自己的内部,别的模块只需要知道调用方法即可,无需知道实现细节。这就是信息隐藏,或者叫封装。
这么做的好处就是自己管理自己,不会与其他模块混到一起,到了后期的扩展 测试 修改 优化 等都会方便许多,也能提高速度,因为模块都是独立的,不存在依赖关系,不会产生A模块没开发完导致B模块无法开发的情况。细节隐藏,如果后期要优化,只需要改动改模块内部逻辑即可,如果一堆代码耦合到一起,改动起来牵涉其他模块,很可能造成误伤。最简单的举例 HashMap 源码,1.7之前实现是数组加链表实现的,根据hashcode值作为依准,1.8以后优化内部逻辑,如果链表内部对象超过8个,就变化为二叉表,但对外提供的put和get等方法没变,知识内部逻辑变化了,不影响调用它的地方。
访问权限级别:
public > protected > 友好的 > private
public : 都能访问
private :只能在当前类的内部引用
protected : 跨包非子类不能访问
友好的 :不能跨包
private 私有的,最好理解,只能在这个类里面使用,出了这个类就不行,即使是自己的子类也不行。
友好的,也是默认级别, 自己能用,子类能用,但子类和当前类要在一个包里面。
protected 自己能用,子类也能用,不管子类和基类是否在同一个包下面。
public 权限最大,谁都可以使用。
区分这几个,是为了更好设计模块。private 一般用于类内部自己使用,一些属性判断之类,只有自己使用;protected 一般是子类,如果子类要重写某些方法或者使用某些属性,就用它;public 看着很方便,但一旦使用,并被大量引用,后期如果要修改,就要考虑好兼容性,不能出错。 private 的好处就是,一旦看见这个标识,就可以比较放心的优化,因为逻辑都是内部的,不牵涉其他,最能给人安心感;public则相反。
对类的实例,尤其是对象属性,如果直接对外暴露接口,外面拿到它的引用,可以做出各种修改,如果不想让外部修改实例,则可以进行保护性措施,比如进行 .clone 或者 生成一个新对象,赋值后对外暴露。如果内部是个final类型,外部想用它的值并作一些修改,也可用到.clone 等方法。
private static final Object[] VALUES = {};
public static final Object[] values(){
return VALUES.clone();
}
private static final ArrayList<String> VALUES = new ArrayList<>();
public static final ArrayList<String> values(){
return new ArrayList<>(VALUES);
}