[英]Eclipse - How come Generate Getters and Setters does not consider “By Reference”
如果java总是通过引用传递变量,那么eclipse为什么不考虑任何因素就生成bean。
代替: return myStr;
需要return new String(myStr);
没有?
编辑
好的,我的例子很糟糕。
让离开日食,当我想返回一个自定义对象。 我是否需要创建一个“复制构造函数”并返回它,就像这样:
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
实例的SomeObject
。 调用doSomething
,该引用的值将复制到bar
,因此现在foo
和bar
是对同一SomeObject
引用。
bar.whatever()
foo
引用的同一对象上调用whatever
。
bar = new SomeObject()
意味着foo
和bar
现在引用了不同的 SomeObject
实例,因此在foo
引用的对象上未调用someOtherMethod
。
这与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;
}
}
您可以根据情况选择适当的返回值类型(正常参考,不变视图或副本)。 这三个选项中的任何一个或全部都可能适合,具体取决于您正在做什么。
java.util.Collections
使得获取Collection
的不变视图变得容易,但是对于自定义类,您需要做自己的不变性。
请记住,只有在可变性存在问题时才需要这样做。 您的MyCustomObject
示例仍然是不可变的(因为调用者无法更改返回的MyCustomObject
实例中的任何状态),因此问题仍然是有争议的。
如果变量是原始变量或不可变变量,则您修改返回的内容将不会影响原始属性。
其他情况下,变量是自定义类型,也许您的类像String一样定义了自己的构造函数,也许不是。 因此,eclipse不知道如何生成它的副本。
众所周知,java通过了引用,因此java程序员习惯于返回引用并允许其他修改。Eclipse将其默认实现。
如果您不喜欢它,则可以返回副本或实现Immutable。
使用getter时,通常不希望创建新对象。 通常,您希望获得对对象属性的引用,以使其更容易使用,进行封装并具有正确的值,即使在使用该属性之前其他更改属性值的情况下也是如此。
用通常被调用的方法创建对象的新实例是不希望这样做的,甚至没有声明这样做是在反模式 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.