2017-04-23 60 views
-2

假設我有一個類,它的一個字段中包含一個對象SampleData,以及該字段的getter和setter。爲什麼我需要使用setter(而不是getter)來設置數據?

public class someClass 
{ 
    private SampleData sampleData; 

    public SampleData getSampleData() 
    { 
     return sampleData; 
    } 

    public void setSampleData(SampleData sampleData) 
    { 
     this.sampleData = sampleData; 
    } 
} 

說我已經實例化了someClass。假設我已有另一個SampleData可用。因此,與二傳手我會做以下,

someClassInstantiated.setSampleData(anotherSampleData); 

爲什麼我需要使用的setter,setSampleData設置此字段的值? 爲什麼我不能這樣做呢?

SampleData sampleData = someClassInstantiated.getSampleData(); 
sampleData = anotherSampleData; 
+0

這取決於你想要實現什麼...... – noobcoder

+0

你試過了嗎? 'SampleData sampleData = someClassInstantiated.getSampleData();'說,「將'sampleData'指向與'getSampleData'返回結果相同的位置,然後'sampleData = anotherSampleData;''說'將sampleData'指向'anotherSampleData'」 - 這不會改變'someClassInstantiated.sampleData'指向的內容 – MadProgrammer

+1

getter和setter的全部用途是,如果沒有對象控制它的完成方式,外部實體不能修改對象的內部狀態。 – Tibrogargan

回答

4

人們似乎忘記了Java仍然使用內存指針來引用數據,它只是隱藏了C/C++擁有的所有真棒指針算法;)

所以,基本上,當你這樣做SampleData sampleData = someClassInstantiated.getSampleData();sampleData指向與someClassInstantiated.sampleData相同的內存位置,例如...

Initial State

如何過,當你做sampleData = anotherSampleData;,您更改sampleData指向是一樣anotherSampleData存儲位置,這並不影響什麼someClassInstantiated.sampleData指向,它仍然保持不變

Updated State

所以,如果我指向一個包含數據的位置,那爲什麼是空?如果我使用的getter方法後打印兩個的sampleData和anotherSampleData,sampleData在爲空並且anotherSampleData不爲空,但是從你說的話,他們都指向同一個位置

這是因爲someClassInstantiated.sampleData仍指向null - 這是實例化時分配給它的默認值,並且(根據您的示例)未被更改。

從長遠來看,您確實不希望它按照您嘗試使用它的方式工作,因爲它打破了封裝原則,對象負責管理數據。

0

當你寫:

SampleData sampleData = someClassInstantiated.getSampleData(); 
sampleData = anotherSampleData; 
在你正在參照的 someClassInstantiated領域的第一線

,但是這個領域並不是指你的對象的sampleData,從而改變它不會改變值在someClassInstantiated

換句話說,這些對象沒有綁定在一起。如果您想在每次使用其他值更改時更改該字段的值,例如observer design pattern

1

在java中你有參考。平等運營商(=)用於指定reference variable以引用Object

讓我們假設someClassInstantiated.getSampleData()返回ObjectA。這是相同的對象稱爲由 private SampleData sampleData;

​​

目前sampleDataObjectA

也讓我們假設anotherSampleData是指ObjectB

sampleData = anotherSampleData; 

現在sampleData是指ObjectB。現在這對private SampleData sampleData;所指的Object沒有任何影響,它仍然是指ObjectA

僅當SampleData的對象是可變的,然後使用.點運算符時,如果狀態被修改,則通過讀取對象的狀態y參考變量之一來反映相同的修改狀態。平等運算符簡單地分配變量來引用一個對象(或基本類型值)

相關問題