1,防御性编程。必要时应当考虑采取保护性拷贝的手段来保护内部的私有数据,先来看下面这个例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->pubicfinalclassPeriod
{
privatefinalDatestart;
privatefinalDateend;
publicPeriod(Datestart,Dateend)
{
if(start.compareTo(end)>0)
thrownewIllegalArgumentException(start+"after"+end);
this.start=start;
this.end=end;
}
publicDategetStart()
{
returnstart;
}
publicDategetEnd()
{
returnend;
}
}
这个类存在两个不安全的地方,首先来看第一个攻击代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Datestart=newDate();
Dateend=newDate();
Periodp=newPeriod(start,end);
end.setYear(78);//改变p的内部数据!
这是因为外部和内部引用了同样的数据,为了解决这个问题,应当修改Period的构造函数:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicPeriod(Datestart,Dateend)
{
this.start=newDate(start.getTime());
this.end=newDate(end.getTime());
if(start.compareTo(end)>0)
thrownewIllegalArgumentException(start+"after"+end);
}
这样内部的私有数据就与外部对象指向不同,则不会被外部改变
再来看第二个攻击代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Datestart=newDate();
Dateend=newDate();
Periodp=newPeriod(start,end);
p.getEnd().setYear(78);//改变p的内部数据!
这很显然是由于公有方法暴露了内部私有数据,我们可以只返回内部私有数据的只读版本(即其一份拷贝)
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicDategetStart()
{
return(Date)start.clone();
}
publicDategetEnd()
{
return(Date)end.clone();
}
2,读到上面这个例子,我想起来了下面这样的代码片段
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassSuit
{
privatefinalStringname;
privatestaticintnextOrdinal=0;
privatefinalintordinal=nextOrdinal++;
privateSuit(Stringname)
{
this.name=name;
}
publicStringtoString()
{
returnname;
}
publicintcompareTo(Objecto)
{
returno
}
publicstaticfinalSuitCLUBS=newSuit("Clubs");
publicstaticfinalSuitDIAMONDS=newSuit("diamonds");
publicstaticfinalSuitHEARTS=newSuit("hearts");
publicstaticfinalSuitSPADES=newSuit("spades");
privatestaticfinalSuit[]PRIVATE_VALUES={CLUBS,DIAMONDS,HEARTS,SPADES};
publicstaticfinalListVALUES=Collections.unmodifiedList(Arrays.asList(PRIVATE_VALUES));
}
分享到:
相关推荐
CoreJava新手笔记(全)CoreJava新手笔记(全)CoreJava新手笔记(全)CoreJava新手笔记(全)CoreJava新手笔记(全)CoreJava新手笔记(全)CoreJava新手笔记(全)
java\CoreJava笔记\CoreJava_day12.doc
java\CoreJava笔记\CoreJava_day06.doc
java\CoreJava笔记\CoreJava_day11.doc
java\CoreJava笔记\CoreJAVA_day01.doc 学习 借鉴
CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 6 CoreJava DAY03 数组 11 CoreJava DAY04 15 CoreJava DAY05 面向对象 17 CoreJava DAY06 类的加载过程、实例化、继承、多态 20 CoreJava DAY07修饰...
corejava基础教程笔记 corejava基础加实例,非常全面的基础知识,非常适合初级人员学习,利用,
达内core_java学习笔记,初学core_java者推荐文档
参考使用,欢迎下载
corejava学习笔记.doc
java\CoreJava笔记\CoreJava_day15.doc
java\CoreJava笔记\CoreJava_day05.doc
java\CoreJava笔记\CoreJava_day13.doc
java\CoreJava笔记\CoreJava_day21.doc
java\CoreJava笔记\CoreJava_day07.doc
java\CoreJava笔记\CoreJava_day19.doc
java\CoreJava笔记\CoreJava_day23.doc
java\CoreJava笔记\CoreJava_day22.doc
java\CoreJava笔记\CoreJava_day10.doc
java\CoreJava笔记\CoreJava_day09.doc