gpt4 book ai didi

java - Eclipse - 为什么生成 Getters 和 Setters 不考虑 "By Reference"

转载 作者:行者123 更新时间:2023-12-01 19:11:12 24 4
gpt4 key购买 nike

如果java总是通过引用传递变量,为什么eclipse会不加考虑地生成bean。

而不是:返回 myStr;

需要是返回新字符串(myStr);

没有?

编辑
好吧,我的例子很糟糕。
让我们离开 Eclipse,当我想返回一个自定义对象时。我是否需要创建一个“复制构造函数”并返回它,如下所示:

return new MyCustomObject(myCustomObject);


class MyCustomObject{

private String str;
public MyCustomObject(String str){
this.str = str;
}

public MyCustomObject(MyCustomObject obj){
this.str = obj.str;
}
}

我必须这样写吗?

最佳答案

没有。

在Java中,每个对象变量都是一个引用。对象不能按值传递,只有基元可以(并且始终如此)。嗯,这有点误导。 引用是按值传递的,但您可以将所有内容视为引用,只是不是 C++ 意义上的引用。

也许使用示例是最简单的。

SomeObject foo;

public void doSomething(SomeObject bar) {
bar.whatever();
bar = new SomeObject();
bar.someOtherMethod();
}

public void doStuff() {
foo = new SomeObject();
doSomething(foo);
}

因此,foo 是对SomeObject 实例的引用。当调用doSomething时,该引用的值被复制到bar,所以现在foobar是引用到同一个 SomeObject

bar.whatever() 行在 foo 引用的同一对象上调用 whatever

bar = new SomeObject() 表示 foobar 现在引用不同 SomeObject 实例,因此 someOtherMethod 不会在 foo 引用的对象上调用。

这与 C++ 完全不同,其中

void doSomething(SomeObject& bar) {
bar = whatever;
}

有完全不同的含义。您真的不应该用 C++ 术语来思考 Java。

关于您的示例,String在 Java 中是不可变的,因此即使对象可以按值传递也没关系。

关于你的第二个例子,如果你想返回一个调用者不能用来污染你的内部状态的对象,那么,是的,你需要有一个复制构造函数(或等效的东西)。

例如:

class ClassWithInternalList {
private List<String> reallyImportantData;

public List<String> getImmutableViewOfData() {
// Take advantage of the java.util.Collections tool for making a List immutable.
return Collections.unmodifiableList(reallyImportantData);
}

public List<String> getSafeCopyOfData() {
// Return a copy that the caller can modify without changing reallyImportantData.
return new ArrayList<String>(reallyImportantData);
}

public List<String> justGetTheData() {
// Return a reference to reallyImportantData that the caller can modify at will.
return reallyImportantData;
}
}

您可以根据情况选择合适的返回值类型(普通引用、不可变 View 或复制)。这三个选项中的任何一个或全部都可能合适,具体取决于您正在做什么。

java.util.Collections 可以轻松获取 Collection 的不可变 View ,但对于自定义类,您需要实现自己的不可变性。

请记住,只有在存在可变性问题时才需要执行此操作。您的 MyCustomObject 示例仍然是不可变的(因为调用者无法更改返回的 MyCustomObject 实例中的任何状态),因此问题仍然没有实际意义。

关于java - Eclipse - 为什么生成 Getters 和 Setters 不考虑 "By Reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8354006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com