原始的类的设计如下
import java.util.Date; public final class SafeMain { private final Date start; private final Date end; private final int name; public SafeMain(Date start,Date end,int name){ if (start.compareTo(end)>0) { throw new IllegalArgumentException(); } this.start = start; this.end = end; this.name = name; } public Date getStart() { return start; } public Date getEnd() { return end; } public int getName() { return name; } @Override public String toString() { return "SafeMain [start=" + start + ", end=" + end + ", name=" + name + "]"; } }
但是可能存在如下的攻击
public static void main(String[] args) { //TOCTOU //1 Date start = new Date(); Date end = new Date(); int name = 111; SafeMain safeMain = new SafeMain(start, end,name); end.setYear(78); name = 23456; System.out.println(safeMain.getEnd().getYear()); System.out.println(safeMain.toString()); //2 safeMain.getEnd().setYear(888); }
最开始的设计是end大于start才满足要求.而且这里的start和end都是不可变的(按照原始的累的设计的要求是这样的),这2中攻击都使类的设计失效.
修正之后的类
public final class SafeMain { private final Date start; private final Date end; private final int name; public SafeMain(Date start,Date end,int name){ this.start = start; this.end = end; this.name = name; if (this.start.compareTo(this.end)>0) { throw new IllegalArgumentException(); } } public Date getStart() { return new Date(start.getTime()); } public Date getEnd() { return new Date(end.getTime()); } public int getName() { return name; } @Override public String toString() { return "SafeMain [start=" + start + ", end=" + end + ", name=" + name + "]"; } }
完美的避免了攻击
不止是在不可变的类的设计中这样保护性拷贝属性,某一些类的属性有一定的限制,在被后面的程序修改之后会产生不可预计的错误,也可以这样做.
相关推荐
java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用
JAVA构造器
Java入门理解构造器
最小的实用的json格式类 ,用于在java后台将list 、vo、bean等等封装为json格式
要学习Java,你必须理解构造器。因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆。但是,构造器和方法又有很多重要的区别。 我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:...
没事的时候自己编写了一个java类的查看器,输入完整类名后,可以显示出类的属性,方法和构造器,使用时要求电脑上安装有jdk。
构造最全的Java面试题构造最全的Java面试题构造最全的Java面试题构造最全的Java面试题构造最全的Java面试题
包括Class类的模板、new对象的内存分配方式、实例和静态。
一个构造方法,带参数,初始化各个属性,特别要求带有年月日的参数,并利用GregorianCalendar日历类生成日期并转化成对应的Date类的日期. 对于每个属性添加一个set和get方法(建议使用Eclipse的Refactor中的...
Java常用类与基础API--String的构造器与常用方法
构造一个圆类和圆柱类 java语言实现,送给需要的朋友
MyBatisPlus条件构造器 -Wrapper详解(为知笔记版,可用网页打开),详解wrapper条件构造器的各种使用方法及其扩展类的使用方法。
Java:String构造器中originalValue.length>size的理解
当用LABVIEW加载 C# 生成的DLL文件 时显示" 该类不包括任何公共构造器"。 原因:类,或方法未放PUBLIC关键字。 解决办法:1、加上关键字;2、重新命名 命名空间(如果不重新命名,在加载时会依然报警,似乎...
多表查询所用到的用来构造list的java类,用于演示在 jpa SQL 查询中如何使用自定义构造器。
本人用java写的构造者模式的小demo,源码里有详细的注释,保证一看就懂。欢迎交流指点。
NX10.0后处理构造器,覆盖安装目录下面的同名文件夹即可