糟糕的编程实践来改变java中的传递对象

时间:2013-07-15 13:39:17

标签: java parameter-passing

我刚读这个堆栈问题:

Is Java "pass-by-reference" or "pass-by-value"?

我想知道使用方法通过它的地址改变对象是否被认为是错误的编程习惯。我对此提出质疑,因为毫无疑问它是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,请务必将其删除。我只是对这种能力如何在现实世界中使用感兴趣。它是否在专业环境中被宽恕?谢谢!

2 个答案:

答案 0 :(得分:2)

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

我赞成(没有特别的顺序)

  1. 要自行更改的对象(例如,通过setter setName()
  2. 不变性并在实用时创建一个新的修改对象

答案 1 :(得分: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