人在什么面前最容易失去抵抗力?
美色, 算是一个, 比如说西施的贡献薄就是忍辱负重, 以身报国, 助越灭吴; 金钱, 算是另外一个, 我们古人常说 "钱乃身外之物, 生不带来死不带去", 但我们又都知道 "有钱能使鬼推磨".
除去美色和金钱, 我认为还有一个, 就是读者的认可 --"二哥, 你的文章真的很棒, 我特别喜欢. 希望能多多更新 Java 基础知识, 真的是受益良多, 就好像是在读王小波的散文, 但又学了编程!"-- 你说, 收到读者这样暖暖的评语, 还需要美色和金钱?"两者皆可抛" 嘛.
这篇文章主要介绍一下 Java 的访问权限控制.
01 访问权限控制的重要性
舒淇曾说过这样一句令人感到震撼后又虎躯一震的话:"我要把我曾经脱下的衣服一件一件的穿回来!" 如今, 她做到了 -- 通过自己的努力, 不仅得到了观众的认可, 得了很多大奖, 还收获了幸福. 尽管, 真的是尽管, 还有一些 "忆往昔峥嵘岁月稠" 的朋友在电脑硬盘的深处留存了一些舒淇早年的珍藏版照片.
我扯这个例子主要为了证明一句话 -- 访问控制 (或隐藏具体实现) 与 "最初的实现并不恰当" 有关 -- 如果舒淇当初那些照片的权限不是那么公开化的话, 那现在就可以私自烧毁了; 或者换一种出道方式; 然而没有如果了.
在你最初的编程生涯中, 不知道你是否创作过下面这样 "优秀" 的代码, 就像程序清单 1-1 那样.
程序清单 1-1:
public class NiubiUtil { public static Date getNextDay() { long millis = 24 * 60 * 60 * 1000; try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } return new Date(System.currentTimeMillis()); } } 本来你这些代码只是自己写着玩呢, 谁知道被一个叫小二哥的同事不经考量地调用了. 这一调用不要紧, 小二哥的代码真的活活地等了一整天 -- 产品经理小王老师某一天心血来潮非要测试小二哥的代码, 然后点了查看下一天的按钮, 程序真的在那静静地等着, 直到下一天真的来临.
后果是, 小王老师为了安抚用户们躁动的情绪把小二哥直接拉出去祭天了; 你躲在角落里瑟瑟发抖, 心里默默念叨了句话 --"小二哥, 你走好, 兄弟真的对不住了".
一场血淋漓的惨案啊! 只因为 Java 访问权限控制的使用不当 -- 该 private 的方法, 结果失误写成了 public-- 论访问权限控制的重要性.
02 为什么需要访问权限控制
我已经在 Java 编程的道路上混迹了多年, 自然也写过无数曾经看起来那么 "优秀" 的代码. 随着时间的推移, 再回首过往的那些代码时, 总有一种 "这真的出自我手?" 的疑问.
这种疑问包含两层意思, 一层是感慨真的写得好, 就好像年老时的李白看见自己年少时写的《望庐山瀑布》:"日照香炉生紫烟, 遥看瀑布挂前川; 疑是银河落九天, 飞流直下三千尺."-- 哟, 老子年轻时写得也不赖啊.
另外一层是感慨真的写得差, 比如说程序清单 1-1, 往事不堪回首啊, 只能都随风, 都随风, 都随风而去!
对于这些写得很差的代码, 我每次看见都想再修改一次, 期待她更可读, 更易理解, 更具可维护性; 但在美好的愿景下, 也存在着巨大的压力, 因为有好多其他的地方引用了要修改的代码, 牵一发而动全身啊.
在变与不变的过程中, 我发现 -- 访问权限控制真的太重要了. 在写代码的过程中, 我们需要尽量遵循这样一个原则 -- 除了那些必须 public 的方法, 尽量把其他方法定义为 private. 这样做的好处是, 在重构 private 方法的时候不必再担惊受怕, 因为它们不会被类外部访问到.
03 protected 权限修饰符是用来干嘛的
我们知道, public 权限修饰符使类的一切方法和属性对外可见; private 权限修饰符使类的一切方法和属性只对内部可见; 那么 protected 权限修饰符呢?
假如有一个叫王二的家伙, 他有三个属性, 分别是私生活, 外在形象和被保护的财产, 就像程序清单 3-1 那样.
程序清单 3-1:
- public class Wanger {
- // 私生活
- private String life;
- // 外在形象
- public String image;
- // 被保护的财产
- protected String money;
} 王二生了一个孩子叫王小二, 就像程序清单 3-2 那样.
程序清单 3-2:
public class Wangxiaoer extends Wanger{ @Override public String toString() { return "可以继承的财产:" + money + "; 塑造的人设:" + image + "; 得不到的私生活:"; } } 王小二可以继承到王二的财产 money(据说王二在王小二出生的第一个月为其存了 100, 以后每个月的利率为 12%, 现在存款是 3758.17, 你知道王小二现在多大了吗?), 也可以模仿一点父亲的外在形象 image, 但却不能按照父亲的私生活方式生活.
注意到三个权限修饰符的区别了吗?
protected 可以保护王二的财产顺利地继承到王小二那里, 外界的人是访问不到的; public 不安全, 因为不仅王小二可以继承访问, 外界其他人也可以访问; private 太私有化, 不仅外界访问不到, 王小二也继承不到.
04 总结
访问权限控制的两个重要作用: 第一是为了防止外界触碰到不该触碰的地方 (private 修饰的成员变量或者方法); 第二是让类的设计者可以更改内部(private 修饰的成员变量或者方法) 的工作方式, 而不必担心有没有对外界造成干扰. 欢迎工作一到五年的 Java 工程师朋友们加入 Java 群: 891219277 群内提供免费的 Java 架构学习资料 (里面有高可用, 高并发, 高性能及分布式, Jvm 性能调优, Spring 源码, MyBatis,Netty,Redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多个知识点的架构资料) 合理利用自己每一分每一秒的时间来学习提升自己, 不要再用 "没有时间" 来掩饰自己思想上的懒惰! 趁年轻, 使劲拼, 给未来的自己一个交代!
来源: https://juejin.im/post/5c00fb82f265da613e21f957