这一章节我们来聊聊为什么需要隐藏具体实现。
一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。
为什么需要隐藏具体实现。
1)让使用者不能随意访问所有的代码。
例如:
package com.ray.ch01;
public class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
上面Bird类,我们隐藏了name这个属性,类的使用者只能通过getName这个方法取得或者setName这个方法操作,而不能对name直接进行任何操作,因为name这个属性相对脆弱,你改我改大家改,改到最后,name可能不是需要的结果,特别有些恶意的使用者,赋值null,这就麻烦了。
反面例子:
package com.ray.ch01;
public class Bird {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Bird bird = new Bird();
bird.name=null;
}
}
上面的代码直接把对象赋值名字为空,但是实际业务这个是不可能存在的,因此,暴露name这个属性对于我们后面的操作充满未知的风险。正确的做法如下:
package com.ray.ch01;
public class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if (name!=null) {
this.name = name;
}else {
System.out.println("名称不能为空");
}
}
public static void main(String[] args) {
Bird bird1 = new Bird();
bird1.setName(null);
Bird bird2 = new Bird();
bird2.setName("jack");
}
}
运行输出:
名称不能为空
上面的代码避免了名字为空的风险,隐藏了脆弱的代码,只暴露必须的代码方法。
2)让创建者可以随意修改隐藏的代码。
除了限制使用者,同时也方便创建者,我们只要返回相同的东西,中间怎么实现,随我们。
例如:
我们根据上面的代码进行改编。
package com.ray.ch01;
public class Bird {
private String name;
private String id;
private void setId() {
id = "123456";
}
public String getName() {
return name;
}
public void setName(String name) {
setId();
if (name != null) {
this.name = name;
} else {
System.out.println("名称不能为空");
}
}
public static void main(String[] args) {
Bird bird1 = new Bird();
bird1.setName(null);
Bird bird2 = new Bird();
bird2.setName("jack");
}
}
我们在setName的同时也setId,虽然代码里面增加了很多,但是对于使用者而言,他是不知道的,他能够使用的和知道的跟上面的代码一样。
最后,本来应该还需要聊一下怎样隐藏具体实现,但是这个话题太宽泛,而且一般都是需要根据需求来做的,所以不做展开。总之一句话:需求决定隐藏什么具体实现。
总结:这一章节我们介绍了为什么需要隐藏具体实现。
这一章节就到这里,谢谢。
-----------------------------------
目录
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
从头写React-like框架的工程搭建实现 最近在网上看到了 Build your own React 这篇文章,作者从零开始实现了一个简易类 React 框架,虽然没有过多的优化,但 React 中的核心思想 Concurrent Mode,Fiber ...
nn-from-scratch, 从头实现神经网络 请阅读与这里代码一起使用的博客文章 ! notebook# Create and activate new virtual environment (optional)virtualenv venvsource
从头开始学习Java课程-资料来源PillsInformática。
聚类算法_使用Matlab+Python实现从头实现聚类算法_项目源码_优质项目分享
java实现验证码功能源码 Java Periphery 是一个高性能库,用于用户空间 Linux 中的 GPIO、LED、PWM、SPI、I2C、MMIO 和串行外设 I/O 接口访问。 我没有尝试从头开始构建它并生成 JNI 包装器。 这节省了大量手动编码...
视频 https://www.bilibili.com/video/BV1914y1s7hi
视频 https://www.bilibili.com/video/BV1914y1s7hi
从头开始实现一些经典的机器学习模型,并针对流行的ML库进行基准测试
军工行业2021年度投资策略:而今迈步从头越-20201115-招商证券.pdf
赖世雄英语从头学 下载-附件资源
外卖订餐java源码 你会学到什么 通过 Java 片段的构建块,您将能够立即了解 Java 编程的要点。 你需要什么 勇敢地浏览存储库! 或替代开源 JDK 1.8 版本 截至今天,该存储库已通过测试 Oracle JDK 1.8 OpenJDK 1.8 ...
Java-3D游戏引擎与基本游戏Java中使用LWJGL,OpenGL,OpenAL等的3D游戏引擎。 从头开始
本资料是UCSF DOCK的使用案例分享的输入资料,将使用DOCK 6.11自带的片段库,使用DOCK/RDKit的 DOCK_D3N功能从头设计分子。便于使用者直接从这部分设计工作开始,不需花时间来准备输入文件。
乙二醇2020年度策略报告:“熊”关漫道真如铁,而今迈步从头越-20191230-光大期货-36页.rar
顺序表,使用数组实现,一组地址连续的存储单元,数组大小有两种方式指定,一是静态分配,二是动态扩展。 注:线性表从1开始,而数组从0开始。 优点:随机访问特性,查找O(1)时间,存储密度高;逻辑上相邻的元素,...
开发人员零java-Mentorama 在此存储库中,将从头开始插入Java Developer模块的Mentorama课程期间开发的所有练习。
3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)
java源码字符串缓冲区 这是 Java String 、 StringBuilder和StringBuffer方法/API 的完整指南。 本指南的源代码示例在我们的本地开发环境中进行了良好的测试,您可以将这些示例用作无错误。 您可以在 上了解更多信息...
Java机器人 这是一个从头开始编写JavaScript机器人
如果您了解一点C或JavaScript,本指南就是从头开始学习Java。 这是一个正在进行的工作,应该在下一个Java LTS(Java 17)发布时准备就绪。 所有代码都在启用预览功能的Java 14上运行。 注意:如果您只希望查看...