2013-05-26 48 views
1

我們可以只使用一個名稱的兩個對象是這樣的:
(我的問題是關於PARAM對象)更新對象不止一個時間

List<ParameterClass> parameters = new ArrayList<ParameterClass>(); 
ParameterClass param = new ParameterClass(); 
param.setName("name1"); 
parameters.add(param); 

param = new ParameterClass(); 
param.setName("name2"); 
parameters.add(param); 

正如你看到這個代碼編譯和工作得很好。但我的問題是你是否推薦這種編碼?使用一個變量用於不同的目標是可以接受爲什麼我們不應該這樣做?

謝謝

+0

謝謝,我糾正它。 – Saeed

回答

1

是的,這是可以接受的,如果這是所有的代碼在聲明和初始化第一個使用這個變量

,編譯器編寫代碼保留的內存區域由帕拉姆指出實例變量,可以使用該變量,那麼你申報設置屬性,

ParameterClass param = new ParameterClass(); 
param.setName("name1"); 
parameters.add(param); 

和初始化的內存另一個區域,並使用相同的變量指向這個領域,但它是一個完全不同的領域,有沒有辦法混合兩種

param = new ParameterClass(); 
param.setName("name2"); 
parameters.add(param); 

當然,你需要參考這些地區通過一些容器對象能夠檢索他們以後

1

我沒有看到參數重用的問題。當然,代碼的可讀性是另一回事。

+1

爲什麼第一個例子會消失?它已經列入清單,所以清單仍然有一個參考。 – Beryllium

+0

由於第一個實例只是指針,並且您將其指向的內存重寫。 –

+0

還有第二個「新的ParameterClass」操作。所以在這之後param指向另一個內存位置,但是這個列表仍然保留着對舊內存的引用。第一個不會丟失。從Java的角度來看,我不知道c#。只需從問題中運行程序,遍歷列表並打印元素:有兩個元素具有不同的內存位置。 – Beryllium

1

在此代碼

ParameterClass param = new ParameterClass(); 

參數是隻是()由新創建的對象的引用。當再次調用new()時,引用將指向新創建的對象。所以你可以說引用是虛構的,因爲你的意圖是填充ArrayList。

從某種意義上說,這實際上是正確的方法。當你說parameters.add(param);實際發生的是另一個參考被創建並指向你的舊對象。現在,您可以自由地將您的舊引用引導至您創建的任何新對象。

2

重用變量是可以接受的,但它確實妨礙代碼的可讀性,也可以導致很難找到的bug 。你需要相應衡量。

2

我會做這樣的事情:

List<ParameterClass> parameters = new ArrayList<ParameterClass>(); 
parameters.add(new ParameterClass("name1")); 
parameters.add(new ParameterClass("name2")); 

這將刪除你的參數變量,並解決您的問題。

你需要一個構造函數,當然需要名字作爲參數,但我認爲這是一個公平的遊戲。

+0

+1根本沒有名字可以防止一些麻煩。 – Beryllium

1

要麼去明宇描述的方式(=不使用名稱的話),另一種可能性是縮小名的範圍:

List<ParameterClass> parameters = new ArrayList<ParameterClass>(); 

{ 
    ParameterClass param = new ParameterClass(); 
    param.setName("name1"); 
    parameters.add(param); 
} 

{ 
    ParameterClass param = new ParameterClass(); 
    param.setName("name2"); 
    parameters.add(param); 
} 

這樣你就可以「再利用」的名稱,它確保參數不會在進一步的道路上以錯誤的方式使用。

這也是「複製粘貼&安全」,因爲這樣的錯誤是很難發現:

ParameterClass param = new ParameterClass(); 
List<ParameterClass> parameters = new ArrayList<ParameterClass>(); 
param.setName("name1"); 
parameters.add(param); 

param.setName("name2"); 
parameters.add(param);