Java Eclipse -为什么生成吸气剂和定位器不考虑“?”引用;
如果java总是通过引用传递变量,那么eclipse为什么不考虑任何因素就生成bean呢 而不是:Java Eclipse -为什么生成吸气剂和定位器不考虑“?”引用;,java,pass-by-reference,Java,Pass By Reference,如果java总是通过引用传递变量,那么eclipse为什么不考虑任何因素就生成bean呢 而不是: 返回myStr 需要 返回新字符串(myStr) 没有 编辑 好吧,我的例子不好。 当我想要返回自定义对象时,让我们离开eclipse。我是否需要创建“复制构造函数”并返回它,如下所示: return new MyCustomObject(myCustomObject); class MyCustomObject{ private String str; public MyCust
返回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
,因此现在foo
和bar
是对同一SomeObject
的引用
行bar.whatever()
在foo
引用的同一对象上调用whatever
bar=newsomeobject()
意味着foo
和bar
现在引用不同的SomeObject
实例,因此someOtherMethod
是而不是foo
引用的对象上调用的
<>这完全不同于C++,其中
void doSomething(SomeObject& bar) {
bar = whatever;
}
有完全不同的含义。你真的不应该用C++来思考java。
关于您的示例,String
s在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;
}
}
ClassWithInternalList{
私有列表真正重要的数据;
公共列表getImmutableViewOfData(){
//利用java.util.Collections工具使列表不可变。
返回集合。不可修改列表(reallyImportantData);
}
公共列表getSafeCopyOfData(){
//返回调用者可以修改而不更改reallyImportantData的副本。
返回新的ArrayList(reallyImportantData);
}
公共列表justgethedata(){
//返回调用方可以随意修改的reallyImportantData的引用。
返回真正重要的数据;
}
}
您可以根据情况选择适当类型的返回值(普通引用、不可变视图或副本)。这三个选项中的任何一个或全部都可能是合适的,具体取决于您正在做什么
java.util.Collections
可以很容易地获得集合的不可变视图,但是对于自定义类,您需要自己进行不可变的操作
请记住,只有在存在可变性问题时才需要这样做。您的MyCustomObject
示例仍然是不可变的(因为调用方无法更改返回的MyCustomObject
实例中的任何状态),所以这个问题仍然没有意义。否
在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
,因此现在foo
和bar
是对同一SomeObject
的引用
行bar.whatever()
在foo
引用的同一对象上调用whatever
bar=newsomeobject()
意味着foo
和bar
现在引用不同的SomeObject
实例,因此someOtherMethod
是而不是foo
引用的对象上调用的
<>这完全不同于C++,其中
void doSomething(SomeObject& bar) {
bar = whatever;
}
有完全不同的含义。你真的不应该用C++来思考java。
关于您的示例,String
s在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;
}
}
ClassWithInternalList{
私有列表真正重要的数据;
公共列表getImmutableViewOfData(){
//利用java.util.Collections工具使列表不可变。
返回集合。不可修改列表(reallyImportantData);
}
公共列表getSafeCopyOfData(){
//返回调用者可以修改而不更改reallyImportantData的副本。
返回新的ArrayList(reallyImportantData);
}
公共列表justgethedata(){
//返回调用方可以随意修改的reallyImportantData的引用。
返回真正重要的数据;
}
}
您可以根据情况选择适当类型的返回值(普通引用、不可变视图或副本)。这三个选项中的任何一个或全部都可能是合适的,具体取决于您正在做什么
java.util.Collections
可以很容易地获得集合的不可变视图,但是对于自定义类,您需要自己进行不可变的操作
请记住,只有在存在可变性问题时才需要这样做。您的MyCustomObjec