繁体   English   中英

Eclipse-为什么生成Getter和Setters不考虑“按参考”

[英]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 ,因此现在foobar是对同一SomeObject引用。

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

bar = new SomeObject()意味着foobar现在引用了不同的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM