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

  近段在项目中,判断需要循环嵌套循环,并在循环中确定需要新建的数据。其实就是,我们有个树结构,需要从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 }
View Code

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

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

2、引进接口

· 接口:

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

 · 实体类:

 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 }
View Code

· 测试:

 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 }
View Code

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

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

 

posted @ 2015-10-29 11:40  编程王小宇  阅读(1594)  评论(0编辑  收藏  举报