0

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

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;
}
4

4 回答 4

3

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

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

于 2013-06-21T16:47:55.777 回答
1

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

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;
}

相反,您将新的model参数引用存储在m. 我认为您在谈论与深拷贝浅拷贝概念相关的内容,其中:

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

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

于 2013-06-21T16:53:34.043 回答
1

行为是一样的。

 Model m = model; 

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

mmodel 引用堆内存中的同一个对象

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

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

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

于 2013-06-21T16:54:13.343 回答
0

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

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

于 2013-06-21T16:47:17.380 回答