簡體   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