我们都知道封装有很多优点,请看如下代码:
public
class
Man
{
private
String name;
private
int age;
public
int getAge() {
return
age;
}
public
String getName() {
return
name;
}
public
void setAge(int i) {
If(age<=0)
return;
age
= i;
}
public
void setName(String string) {
name
= string;
}
}
如果,我们要将
name
拆分为
firstname
与
lastname
,对于访问器的代码,我们可以改写为如下:
public String
getName() {
return
firsst
name
+" "+lastname
;
}
这样,除了改变类的方法外,不会影响其他代码
,
这样有利于降低程序的耦合性。
还有就是更改器可执行错误检查,不合条件的值可以不予处理。
比如,我们想设置
age
的值,其值必须大于
0
。我们可以在
setAge
方法里面做检查。
可是难道我们把类的实例域设置为私有的(
private
),然后提供其访问器与更改器,就真的实现了封装了吗?
请看如下代码:
public class Order{
private
Man man;
public
Man getMan() {
return
man;
}
public
void setMan(Man man) {
this.man
= man;
}
}
该类中有个实例变量:引用
Man
的实例对象一个
man
。它的访问器方法返回的是一个
Man
对象。这样做,其实没有起到封装的作用。如:
Order
o=…;
Man
man=o.getMan();
man.setName("mark");
System.out.println(
o
.getMan().getName()
);
//
输出
mark
。
这样就改变了原
Order
对象中实例域
man
的状态(一般类都有一组特定的实例域值,这些值的集合就是这个对象的当前状态),
man
中的
name
属性由原来的值变为了
"mark"
。很显然这是一个有漏洞的封装!!!
所以对于这种引用类型的实例域,我们应该改写其访问器方法为:
public Man getMan()
{
return
(Man)man.clone()
;
}
此时
Man
类的代码需要改写为:
public
c
lass Man implements Cloneable
{//实现标记接口Cloneable。意味这该Man类可以克隆
private
String name;
private
Date birthday;
private
int age;
public
String getName() {
return
name;
}
public
void setName(String string) {
name
= string;
}
public
Man(String name,Date d,int age) {
this.name
= name;
this.birthday=d;
this.age=age;
}
/**
* 覆盖Object中的clone()方法。
*/
public
Object clone() throws CloneNotSupportedException {
Man cloned = (Man)super.clone();//浅克隆(不会克隆子对象,
子
对象需单独克隆)
cloned.birthday=(Date)birthday.clone();//克隆子对象
return
cloned;
}
public
int getAge() {
return
age;
}
public
Date getBirthday() {
return
birthday;
}
public
void setAge(int i) {
age
= i;
}
public
void setBirthday(Date date) {
birthday
= date;
}
}
这样就不会出现上面所说的封装漏洞了
。
这里,顺便说一下
final
实例域。将实例域定义为
final
,构建对象时就必须初始化这样的域,也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,且在后面的操作中,不能够再对它进行修改。
final
修饰符大都应用于基本数据,或者不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类,
String
类就是一个不可变的类)。对于可变的类,使用
final
修饰可能会对读者造成混乱。例如,
private
final date birthday;
仅仅意味着存储在
birthday
变量中的对象引用在对象构造之后不能改变,而并不意味着
birthday
引用的
Date
实例对象是一个常量,任何方法都可以对
birthday
引用的
Date
对象调用
setTime
方法改变
birthday
引用的
Date
实例对象的状态。
分享到:
相关推荐
教你简单的在win7系统下集成系统漏洞并封装.doc
先下载一个PE→找一台测试机安装原版XP→安装常用软件如office、PDF等(根据需要,最好安装一个驱动精灵带网卡驱动版)→打系统漏洞补丁→使用该工具封装→重启之后不要进系统使用PE引导→制作当前系统状态GHOST→将...
和开发的迭代几进几出,仍然漏洞无数! 浪费时间就等于浪费生命!我几乎无法忍受这样的事情。于是我们决定把许多复杂而频 繁的工作封装成二次开发组件,大大简化开发工作,同时也提供开发的安全性,缩短开发周 ...
攻击者可以在未授权的情况下将 payload 封装在 T3 协议中,通过对 T3 协议中的 payload 进行反序列化,从而实现对存在漏洞的 WebLogic 组件进行远程攻击,执行任意代码并可获取目标系统的所有权限。漏洞危害通过该...
某个技术组件版本升级,依赖包升级导致部分语法或者API过期,或者组件修复紧急的漏洞,从而会导致分布式系统下各个服务被动的升级迭代,很容易引发意外的问题;不同的服务中对组件的依赖和版本各不相同,从而导致不...
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...
这是对上一个vs2008连接Acess数据库的改进版本,更加安全一点,希望大家能看明白,中间有一部分代码我用函数封装起来,另外数据库上一个vs2008连接Acess数据库窗体登录中是有的,就不复传了
qark, 查找几个安全相关的Android应用程序漏洞的工具 QARK 费用为英镑/英镑英镑/英镑eview英镑这个工具旨在寻找在源代码或者封装的APKs中的几个安全相关的安卓应用程序漏洞。 工具还能够创建"proof-of-concept"可以...
CVE-2012-1823出来时据说是...sapi在PHP中的作用,类似于一个消息的“传递者”,比如我在《 Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写 》一文中介绍的fpm,他的作用就是接受Web容器通过fastcgi协议封装
ThinkPHP借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等,融合了Struts的 Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作...
所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台管理系统。那么,现在若依来了。诚意...
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站...
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用...
本项目已停止维护, 转而维护这个项目; tools下有几个工具,所以项目文件比较大,...使用docker封装,使用参数运行 使用crawlergo爬取网接,传给xray扫描 使用dirsearch遍历目录及文件,传给xray扫描 集成jsfinder、
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站...
之前使用的富文本编辑器是uEditor,kindEditor,感觉不太方便。 近期项目vue单页面,就使用vue-quill-edit这个编辑器组件吧! 一、安装 cnpm install vue-quill-editor 二、引入 ... import VueQuillEditor from 'vue-...
最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布... 封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现. 然而近期th
opentsdb-java-sdk目前实现的功能查询数据,支持同步和异步写入数据,支持异步回调删除数据查询最新数据查询metric、tag_key和tag_value,支持auto_complete`源码中CrudTest类提供了一些使用说明和测试,包括并发...
因漏扫中发现Fastdfs低版本存在安全漏洞(Nginx版本过低),此外fastdfs与Nginx版本属于强依赖关系,因此只能将版本进行整体升级,再经过Dockerfile进行编译封装新版本镜像,经测试此版本不存在安全漏洞问题。...
Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm...