3

我只是在阅读这个堆栈问题:

Java 是“按引用传递”还是“按值传递”?

而且我想知道使用一种方法通过对象的地址来更改对象是否被认为是不好的编程习惯。我对此提出质疑,因为它无疑是 Java 的一个令人困惑的属性。

因此,您可以从上述问题中获取此代码:

Person person;
person = new Person("Tom");
changeName(person);

//I didn't use Person person below as an argument to be nice
static void changeName(Person anotherReferenceToTheSamePersonObject) {
    anotherReferenceToTheSamePersonObject.setName("Jerry");
}

由于其令人困惑的性质,这似乎确实是编程中要避免的事情。这通常是一种可接受的 Java 编程方法吗?

(当然,经典的替代方法是以新名称作为参数调用 person.changeName() 函数。)

如果这不适合 Stack,我一定会删除它。我只是对如何在现实世界中使用这种能力感兴趣。它在专业环境中被宽恕吗?谢谢!

4

2 回答 2

2

我当然认为这令人困惑,而且很大程度上出乎意料。除非该方法被明确命名,否则我通常希望该方法不会更改传递的参数。

我赞成(不分先后)

  1. 改变自身的对象(例如通过 setter setName()
  2. 不变性并在可行的情况下创建新的修改对象
于 2013-07-15T13:41:40.567 回答
2

实际上,这是 Java 的预期行为。在方法中,您只能更改对象的状态,但不能更改对象本身。所以肯定这不是一个坏习惯。

这一切都取决于你的用例是什么,以及你需要用你的方法做什么。最好的例子是 setter 方法,它是每个bean对象的一部分。

如果您的方法如下所示:

static void changeName(Person anotherReferenceToTheSamePersonObject) {
    anotherReferenceToTheSamePersonObject.setName("Jerry");
    // you change the state of the object on heap you passed in
}

您可以更改人员对象的状态

Person person= new Person("John");
changeName(person);
System.out.println(person.getName()); // prints Jerry

但如果 changeName 看起来像:

static void changeName(Person anotherReferenceToTheSamePersonObject) {
    anotherReferenceToTheSamePersonObject= new Person("Jerry")
    // you assign a new object to a reference-copy - nothing happens to John object on heap
}

Person person= new Person("John");
changeName(person);
System.out.println(person.getName()); // prints John
于 2013-07-15T13:42:00.293 回答