文档章节

从头认识java-1.3 隐藏具体实现

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 757
阅读 3
收藏 0

这一章节我们来聊聊为什么需要隐藏具体实现。

一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。

为什么需要隐藏具体实现。

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,虽然代码里面增加了很多,但是对于使用者而言,他是不知道的,他能够使用的和知道的跟上面的代码一样。


最后,本来应该还需要聊一下怎样隐藏具体实现,但是这个话题太宽泛,而且一般都是需要根据需求来做的,所以不做展开。总之一句话:需求决定隐藏什么具体实现。


总结:这一章节我们介绍了为什么需要隐藏具体实现。


这一章节就到这里,谢谢。

-----------------------------------

目录



版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/49150373

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
[敏捷JAVA读书笔记-java基础部分] 第一章

今年年初到海淀图书城购买了一个Agile Java(敏捷java),匆匆翻看了几章就束之高阁,最近在班车上无事可做,拿出来重读一下,一方面学一下TDD,一方面梳理一下自己的JAVA基础知识,读书的时间...

穿越星辰
2010/05/13
0
0
stream in java8

如果使用过scala,使用scala函数编程思想处理数据,那酸爽谁用谁知道。使用java老觉得不得劲,但java8借用了scala的思想,引入了函数编程思想,那就是stream,随后我们慢慢体验她的妙处。 Ja...

jacksu在简书
01/30
0
0
【JVM系列】深入了解JVM 、JRE、JDK三者的联系

JDK: Java Development Tool Kit(Java开发工具包)。JDK就是我们用来做事情的工具,它包括JRE还有其他工具。我们所说版本的不同,也就是说它里面的工具有差异。就像是你不同的工具箱里放着不同...

磊神Ray
2011/09/21
0
1
[敏捷JAVA读书笔记-java基础部分] 第一章

今年年初到海淀图书城购买了一个Agile Java(敏捷java),匆匆翻看了几章就束之高阁,最近在班车上无事可做,拿出来重读一下,一方面学一下TDD,一方面梳理一下自己的JAVA基础知识,读书的时间...

inferrrrrr
2010/05/11
0
1
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js实现产生n个随机数,并且随机数之和是固定值

function getrandom(minnum , maxnum ,total,size){ var num = total; //定义整数 var length= size; //定义多个整数的数量 var numArr = []; while(length > 1){ var rnd = Math.floor(Mat......

开源昕昕
19分钟前
2
0
精选Spring Boot三十五道必知必会知识点!

Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家。本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spring Boot、Spring MVC 和 Sp...

Java填坑之路
20分钟前
2
0
MyBatis学习笔记

相关文档 mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译 MyBatis 处理sql中的 大于,小于,大于等于,小于等于

OSC_fly
21分钟前
0
0
Gradle从不同地方复制文件到一个文件夹/打zip包

复制 task copySDK(type: Copy, dependsOn: [":fatJarTask"]) { delete JAR_NAME delete SDK_OUT_PATH delete "$ROOT_BUILD_PATH/$SDK_ZIP_NAME" into('/jniLibs') {......

SuShine
21分钟前
1
0
CentOS关闭占用端口,修改Apache默认端口,并重启Apache

查找并关闭进程 在Linux系统中可以使用lsof命令和kill命令,两个命令配合查找并关闭占用端口的进程 查看某一端口使用情况的命令: lsof -i:端口号 效果如下,PID即进程的ID 根据PID关闭进程,...

临江仙卜算子
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部