zoukankan      html  css  js  c++  java
  • 如何防止参数中的实体对象被修改

      近段在项目中,判断需要循环嵌套循环,并在循环中确定需要新建的数据。其实就是,我们有个树结构,需要从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()+"	model.getTypeName()"+model.getTypeName());
    12     }
    13     private static void setModelValue(JustPlayModel model){
    14         model.setName("名称被我修改了,哈哈哈");
    15     }
    16 }
    View Code

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

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

  • 相关阅读:
    ContextMenustrip 控件
    Toolstrip 工具栏控件
    Menustrip控件和ContextMenustrip控件
    TabControl 选项卡控件
    GroupBox 分组框控件
    Pnel控件
    【bzoj3427】Poi2013 Bytecomputer dp
    【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
    【bzoj1334】[Baltic2008]Elect 背包dp
    【bzoj1369】[Baltic2003]Gem 树形dp
  • 原文地址:https://www.cnblogs.com/jkgyu/p/4919998.html
Copyright © 2011-2022 走看看