Java Eclipse -为什么生成吸气剂和定位器不考虑“?”引用;

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

如果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
,因此现在
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