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