如何防止参数中的实体对象被修改

  近段在项目中,判断需要循环嵌套循环,并在循环中确定需要新建的数据。其实就是,我们有个树结构,需要从DB中查询所有的某个层级节点的数据,并循环每条记录,为每条记录依据一个xml来判断该节点下哪些子节点缺失,缺失的话就新增。

  每次循环中需要构造一些属性。结果在对Model对象未克隆时,出现属性值混乱。所以我后来就干脆用了克隆方法。

-----------------------------------我是正文分割线-------正文分割线-------分割线---------线--------------------------------------

防止传入的实体参数对象的某些属性被修改的简单方案:

1、克隆实体类

· 实体类:

 1 public class equipmentModel implements Cloneable{
 2     private String name;
 3     private String typeName;
 4     public String getName() {
 5         return name;
 6     }
 7     public String getCaption() {
 8         return name;
 9     }
10     public String getTypeName() {
11         return typeName;
12     }
13
14     public void setTypeName(String typeName) {
15         this.typeName = typeName;
16     }
17     public equipmentModel  clone() throws CloneNotSupportedException{
18         //return (equipmentModel)super.clone();
19         equipmentModel o=null;
20         try
21          {
22          o=(equipmentModel)super.clone();//Object中的clone()识别出你要复制的是哪一
23 // 个对象。
24          }
25         catch(CloneNotSupportedException e)
26          {
27              System.out.println(e.toString());
28          }
29         return o;
30     }
31 }

· 调用:
方法(equipModel.clone());

说明:每次调用方法都会克隆一个对象,会有性能方面的忧虑。另外,上面实体类克隆方式有个局限:不适用于实体类中有引用类型属性的情况。此时不会对引用对象实现可能。

2、引进接口

· 接口:

1 public interface IjustPlay {
2     String getName();
3
4     String getTypeName();
5
6 }

 · 实体类:

 1 public class JustPlayModel implements IjustPlay {
 2     private String name;
 3     private String typeName;
 4     public String getName() {
 5         return name;
 6     }
 7     public void setName(String name) {
 8         this.name = name;
 9     }
10
11     public String getTypeName() {
12         return typeName;
13     }
14     public void setTypeName(String typeName) {
15         this.typeName = typeName;
16     }
17
18 }

· 测试:

 1 public class JustPlay {
 2  public static void main(String[] args) {
 3         JustPlayModel model = new JustPlayModel();
 4         model.setName("名称哈哈哈");
 5         model.setTypeName("类型名称嘻嘻嘻");
 6         getModelValue(model);
 7         setModelValue(model);
 8         getModelValue(model);
 9     }
10     private static void getModelValue(IjustPlay model){
11         System.out.println("model.getName():"+model.getName()+"\tmodel.getTypeName()"+model.getTypeName());
12     }
13     private static void setModelValue(JustPlayModel model){
14         model.setName("名称被我修改了,哈哈哈");
15     }
16 }

说明:其实原理很简单,对禁止修改实体的方法的参数设置为接口类型,而接口中只声明get方,不声明set方法,这就实现了不能修改实体对象的功能了。

--------------------------结束分割线----分割线---------------对于通过框架的方式,因为不熟,不好举例,希望大神指导------------------

时间: 2024-10-25 22:14:03

如何防止参数中的实体对象被修改的相关文章

理解Javascript参数中的arguments对象

ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载. Javascript中arguments的存在可以弥补javascript中函数没有重载的不足. Javascript中函数中的参数是以数组的形式保存的,所以在JavaScript中调用函数给函数传递的参数时,不会受到我们定义函数时设置的参数个数的限制.也就是说如果我们给一个函数定义了2个参数,我们传递的时候可以不传,可以传一个,也可以传两个,传三个...都可以,不会受函数参数个数的影响.arguments类似

EBS OAF开发中实体对象和视图对象的属性设置器

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle Application Framework Documentation Set, Release 12.2 > Oracle Application Framework Developer's Guide > Chapter 5: Implementing Server-Side Features > Entity Object and Vi

Spring MVC中如何传递对象参数

springController: [java] view plaincopy @Controller @RequestMapping("/user") public UserController extends BaseController{ @RequestMapping("/addUser") public void testBinderOuput(@ModelAttribute User user, HttpServletRequest request, H

详解javascript中的this对象

详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其中this "指针"就是实现面向对象的一个很重要的特性.但是this也是Javascript中一个非常容易理解错,进而用错的特性.特别是对于接触静态语言比较久了的同志来说更是如此. 示例说明 我们先来看一个最简单的示例: <script type=&q

关于Javascript中通过实例对象修改原型对象属性值的问题

Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的说就1种,即Object类型.往细的说有:Object类型.Array类型.Date类型.Regexp类型.Function类型等. 当原型对象的属性值为基本类型的数据值时,通过实例对象修改属性值从而引起原型对象的属性值发生变化的情况不会发生.当原型对象的属性值为引用类型的数据值时,通过实例对象修改

Android/iOS访问wcf传递参数为实体对象的问题

简单记录一下使用实体对象作为参数的传递! 在服务端使用webservice时是没有问题的,但是当替换成wcf时就出现传递的参数无法序列化的问题! 服务端代码: Service1.svc namespace WcfTeacherService { // 注意: 使用"重构"菜单上的"重命名"命令,可以同时更改代码.svc 和配置文件中的类名"Service1". // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择

Hibernate中实体对象的状态

实体对象的状态 这里的实体对象是指Hibernate的O/R映射关系中的域对象(即O/R中的O).实体对象的生命周期是指实体对象由产生到被GC回收的一段过程,实体对象的生命周期包括3种状态:自由状态(Transient),持久状态(Persistent)和游离状态(Detached). 1.自由状态 自由状态是指实体对象在内存中自由存在,但此时它与数据库无关.主要有一下两个特征: >> 不处于Session的缓存中,也就是不被任何一个Session关联. >> 在数据库中没有对应的

Objective-C中ORM的运用:实体对象和字典的相互自动转换

http://blog.csdn.net/cooldragon/article/details/18991973 iOS开发中基于ORM的框架很多,如SQLitePersistentObject,实际开发中需求不同或场景不同,方式方法也就不同,有时项目中用不上ORM框架,或者出于公司或项目组习惯或规范.实际项目需求或技术要求等等原因,不会采用完整的ORM框架,但一些重复啰嗦的代码使用一定的ORM功能还是很能提高效率的. 基于性能或灵活性考虑,或复杂查询的需求,或项目组要求,项目中数据库存取一般直

EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上是只有产品组维护,里面包含其所有的业务逻辑,并提供相应的Expert给自己或者其它产品组使用.而VO是各个组根据需要或基于EO或者只读的SQL而建立的,里面可以根据需要添加自己的业务实现和逻辑. 对于EO内部的验证功能,在开发文档中主要介绍了三种: 1. 在setter里面实现单个属性的验证.这主要是对于没有依赖关系的属性,也就是说它的验证不需要其它会被修改的属性的支持.比如,验证