从头认识java-1.3 隐藏具体实现
2015-10-15 11:58
465 查看
这一章节我们来聊聊为什么需要隐藏具体实现。
一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。
为什么需要隐藏具体实现。
1)让使用者不能随意访问所有的代码。
例如:
上面Bird类,我们隐藏了name这个属性,类的使用者只能通过getName这个方法取得或者setName这个方法操作,而不能对name直接进行任何操作,因为name这个属性相对脆弱,你改我改大家改,改到最后,name可能不是需要的结果,特别有些恶意的使用者,赋值null,这就麻烦了。
反面例子:
上面的代码直接把对象赋值名字为空,但是实际业务这个是不可能存在的,因此,暴露name这个属性对于我们后面的操作充满未知的风险。正确的做法如下:
运行输出:
名称不能为空
上面的代码避免了名字为空的风险,隐藏了脆弱的代码,只暴露必须的代码方法。
2)让创建者可以随意修改隐藏的代码。
除了限制使用者,同时也方便创建者,我们只要返回相同的东西,中间怎么实现,随我们。
例如:
我们根据上面的代码进行改编。
我们在setName的同时也setId,虽然代码里面增加了很多,但是对于使用者而言,他是不知道的,他能够使用的和知道的跟上面的代码一样。
最后,本来应该还需要聊一下怎样隐藏具体实现,但是这个话题太宽泛,而且一般都是需要根据需求来做的,所以不做展开。总之一句话:需求决定隐藏什么具体实现。
总结:这一章节我们介绍了为什么需要隐藏具体实现。
这一章节就到这里,谢谢。
-----------------------------------
目录
一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。
为什么需要隐藏具体实现。
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,虽然代码里面增加了很多,但是对于使用者而言,他是不知道的,他能够使用的和知道的跟上面的代码一样。
最后,本来应该还需要聊一下怎样隐藏具体实现,但是这个话题太宽泛,而且一般都是需要根据需求来做的,所以不做展开。总之一句话:需求决定隐藏什么具体实现。
总结:这一章节我们介绍了为什么需要隐藏具体实现。
这一章节就到这里,谢谢。
-----------------------------------
目录
相关文章推荐
- Java核心技术第6章(3)
- Java之旅(三)--- JSTL和EL表情
- Java 容器 彻底掌握
- HBase Java API类介绍
- 深入详解Struts2——struts2的配置文件
- myeclipse使用maven构建struts2项目详解
- myeclipse中maven项目打包过程
- java.lang.NoClassDefFoundError解决方法
- .net调java写的webService传过去的datetime,int等非string类型为null的问题
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获 3ff0
- java中常见异常
- Comparable接口与Comparator接口
- Spring之——quartz集群的问题及解决方案(基于Spring4.0+quartz2.2.1的集群架构)
- Java基础知识学习(三)
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- JAVA8新特性学习
- Java中的深拷贝和浅拷贝
- WEKA之TwoClassStats.java源码解读
- JDBC、JTA、Spring的事务管理
- WEKA之ThresholdCurve.java方法类解读