簡體   English   中英

我可以為同一個變量使用兩個名字嗎?

[英]Can I have two names for the same variable?

問題的簡短版本:

我這樣做: x = y 然后我改變xy不變。 我想要的是以某種方式“綁定” xy ,每當我改變x時我都會改變y

擴展版本(包含一些細節):

我寫了一個類(“第一”類),它生成另一個類(“第二”類)的對象。 更詳細地說,第二類的每個對象都有一個名稱作為唯一標識符。 我使用第二個類中的對象名稱調用第一個類的靜態方法。 第一個類檢查是否已生成此類對象(如果它存在於第一個類的靜態HashMap中)。 如果已經存在,則返回。 如果還沒有,則創建它,添加到HashMap並返回。

然后我有以下問題。 在我的程序的某個階段,我從第一個類的HashMap中獲取一個具有特定名稱的對象。 我對此對象執行某些操作(例如,更改某些字段的值)。 但是HashMap中的對象看不到這些變化! 所以,事實上,我沒有從HashMap“獲取”一個對象,我“創建了這個對象的副本”,這是我想要避免的。

添加:

正如答案中提到的那樣,我不應該有所描述的行為。 而我實際上沒有它(我誤解了我的程序的行為)。 我用對象的名字弄錯了。 我想通過它的名稱來引用一個現有的對象,並且我使用了一個錯誤的名稱,所以我實際創建了一個新對象,這就是為什么我沒有看到我對舊對象所做的任何更改。

但無論如何,我了解到如果我從HashMap中獲取一個對象並對該對象進行一些更改,它們也將應用於HashMap中的“坐”對象。 所以,我可以給同一個對象提供不同的引用,我可以使用這些引用中的任何一個來改變對象的狀態。

謝謝您的回答。

好吧,你不能別名變量。 但是,您應該知道,如果對xy引用的對象進行更改,那么這些更改將通過任一變量可見。 引用類型變量的值是引用,而不是對象本身。

在你的情況下聽起來應該是這種情況 - 除非你明確地放置了一些克隆,每個名稱實際上應該只有一個對象,並且你通過一個變量對該對象所做的任何更改都應該通過其他人可見通過地圖。 對象克隆不僅會自動發生。

我建議你嘗試創建一個簡短但完整的示例程序來演示這個問題 - 我懷疑在這樣做的過程中,你會在你的代碼中找到一個解釋行為的錯誤。

我開始寫一個很長的答案,但Jon更快。 正如他所說,你想要的行為應該是默認行為,除非你自己做了些什么。

這是一個有趣的問題,它將把我們帶入=運算符背后的魔法。

這個運算符是一個賦值運算符,將分配給變量x變量的參考y 也就是說,如果參考y處的對象發生變化,參考的對象也將被改變。

當您調用addd時,通常就是集合的情況。 如果x和y是對同一集合的引用,則在此集合上調用add將更新兩個引用。

但是,我認為你所處的情況就是這樣,但String對象並非如此。 當您嘗試更新String時,例如通過調用+ ,Java編譯器實際上使用新值創建另一個變量並更改引用。 因此,分配先前的值不會反映新值的變化。

在我的程序的某個階段,我從第一個類的HashMap中獲取一個具有特定名稱的對象。 我對此對象執行某些操作(例如,更改某些字段的值)。 但是HashMap中的對象看不到這些變化! 所以,事實上,我沒有從HashMap“獲取”一個對象,我“創建了這個對象的副本”,這是我想要避免的。

使用get()HashMapget()對象不是復制操作。 因此,除非您自己明確地復制它,否則這聽起來像是一個線程問題; 實際上,從線程X更改對象的字段可能對線程Y可見也可能不可見,即使它與您正在查看的對象完全相同。 這是一個非常棘手的領域; 我建議獲得Java Concurrency In Practice的副本。

使用JavaFX:

var y = 10;
def x = bind y;

println(x); // prints 10

y = 12;

println(x); // prints 12

好吧,不是你的問題的答案,但我喜歡它的綁定機制^^。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM