【问题标题】:What's the difference between a modified method parameter and that of a copy of it in Java?修改后的方法参数与 Java 中的方法参数副本有什么区别?
【发布时间】:2013-06-18 21:16:23
【问题描述】:

这两种方法有什么区别吗?

public Long saveModel(Model model) {
    model.setUpdated(new Date());
    Long id = dao.save(model);
    return id;
}

public Long saveModel(Model model) {
    Model m = model;
    m.setUpdated(new Date());
    Long id = dao.save(m);
    return id;
}

【问题讨论】:

  • 在我看来是一样的——除了短暂且冗余的变量“m”

标签: java variables methods parameters arguments


【解决方案1】:

不是从行为的角度来看,同时运行两者会显示同样多。

从可读性的角度来看,第二个是 IMO 有点误导,因为有一个 暗示“有趣”的事情正在发生,而实际上并没有。

【讨论】:

    【解决方案2】:

    只是一个小小的说明。您实际上并没有复制参数:

    public Long saveModel(Model model) {
        Model m = model; //Instance of the Model class that references the parameter
        m.setUpdated(new Date());
        Long id = dao.save(m);
        return id;
    }
    

    相反,您在m 中存储了对model 参数的新引用。我认为您在谈论与 Deep CopyShallow Copy 的概念相关的内容,其中:

    • 深拷贝意味着克隆主对象及其所有内部引用(简而言之:为每个涉及的对象创建新实例)。
    • 浅拷贝意味着克隆主元素,保留对其派生元素的引用(例如复制Car,但让他的owner引用与原始owner相同的owner)。

    在这里,两种方法都是一样的。唯一的区别是额外的Model 对象。

    【讨论】:

      【解决方案3】:

      行为是一样的。

       Model m = model; 
      

      您正在创建一个引用相同模型变量的局部变量。所以它不是副本。这确实是一个参考变量副本。

      mmodel指的是堆内存中的同一个对象

      因此,如果您更改 m 或模型,例如使用 set methods

      m.setUpdated(new Date());
      model.getUpdated(); --> will get the date object you set above
      

      所以它不是对象本身的副本。它是引用变量的副本

      【讨论】:

        【解决方案4】:

        这两种方法有什么区别吗?

        他们做同样的事情。 (不过,它们的写法不同。)

        【讨论】:

          猜你喜欢
          • 2018-08-21
          • 2016-10-07
          • 1970-01-01
          • 2020-05-06
          • 2018-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          相关资源
          最近更新 更多