[英]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.