2013-09-26 119 views
1

假設我們要設置的int y5我們一般做y=5;有什麼用getter和setter

int y=0; 
y=5; 

值,但比我們在下面的方式

public class x { 
private int y; 
    public int getY() { 
    return y; 
} 
public void setY(int y) { 
    this.y = y; 
} 
做,如果我們使用getter和setter的

,之後我們創建x的對象,並調用其方法

x x1=new x(); 
x1.setY(5); 

我的問題是如果我們可以直接設置y = 5那麼爲什麼使用getter和setter方法

+4

你的例子很困惑,因爲將'x'設置爲5會改變'x'的值 - 而調用'x1。setY(5)'在'x1'的值引用的對象內改變'y'的值... –

+1

[爲什麼使用getters和setters?]可能的重複(http://stackoverflow.com/questions/ 1568091/why-use-getters-and-setters) –

+0

@JonSkeet對不起我現在要改變這個問題 – SpringLearner

回答

1

是的,你可以做類的數據成員的直接訪問,但按照該OOPS概念需要對數據進行封裝對象內,我們應該利用周圍的接口數據來訪問它。由於數據是特定對象的私有屬性,因此我們將getter和setter定義爲訪問該數據的接口。 Getters和Setter也提供了一種隱藏數據存儲細節的方法,如果你想在每次獲取或設置操作之前處理數據,而這些操作是通過直接訪問變量無法完成的,那麼這些數據可以方便地使用。

+0

感謝您的答案 – SpringLearner

1

如果你想控制什麼值可以設置使用setter。

如何

cat.weight = 0 

VS

cat.setWeight(0);

和二傳手,你可以檢查是否重量有適當的值

public void setWeight(int weight){ 
    if(weight > 0){ 
     this.weight = weight; 
    } 
    else{ 
     // SHOUT I dont want my cat to die 
    } 
} 
+0

我可以多解釋一下嗎 – SpringLearner

+0

@javaBeginner:我已經更新了我的答案。 – xyz

0

它基本上是在計算安全原因。 您總是將類變量聲明爲私有變量,並且您無法使用x = 5;將其更改爲外部變量。 但是用setter和getters可以實現這一點。

0

這是在面向對象編程中最常用的,它跟上了封裝的概念。通過將類的成員變量保持爲私有,您可以隱藏它們並防止其受到其他代碼的影響。

您只能使用公共成員函數修改這些變量。設置該接口並隱藏數據或細節可以更輕鬆地閱讀代碼。

你可以在這裏閱讀更多:http://en.wikipedia.org/wiki/Mutator_method

0

獲取者和設置者的真正意義在於,你應該只在合適的地方使用它們,並且他們可以做的不僅僅是獲取和設置字段。

  1. 你可以只有一個吸氣劑。然後該屬性是隻讀的。這個 應該是最常見的情況。
  2. 你只能有一個設置,使得性能配置,但 溝通,沒有什麼別的應該取決於它的價值
  3. 吸氣可以計算從多個字段的值,而不是返回 一個領域。
  4. 吸氣劑可以使一個防守副本
  5. 吸氣可以懶洋洋地執行一個昂貴的讀取操作,並使用 場緩存值
  6. 一個二傳手可以做的完整性檢查,並拋出IllegalArgumentException
  7. 可以將setter通知聽衆對值的更改

所有這些東西都是隱藏在簡單的「getter和setter」接口後面的實現細節。封裝就是這樣。

0

getter和setter方法被用作在面向對象編程的最佳實踐的一部分。 要遵循的一些步驟如下:

  • 將所有實例變量標記爲私有。
  • 公開setter和getters
  • 在您的setter方法中,只有在驗證輸入後才允許設置值。

通過以下操作,可以確保變量未設置爲錯誤和無效輸入。

您可以調用validate()方法在您的setter中,並具有驗證該方法中的輸入的邏輯。

0

這是一個漫長而長時間的對話。

我只是在這裏指出你正確的方向,但你需要爲你自己理解和內化它。

一個原因是吸氣劑和吸附劑讓你保護自己。您可以控制變量被修改時發生的情況。例如,你可以決定拒絕一些值 - 也許你的領域需要是一個積極的整數。你不能相信呼叫者遵守這個約束(規則1的規則,不要相信任何人),並且需要強制執行它,可能有一個斷言。 setter允許您在實際修改之前驗證該值。直接訪問可以讓來電者在您的控制範圍之外放入非法值 - 因爲可能發生,所以將發生

另一個原因是抽象:如果你公開這個領域,你就永遠堅持你的表示。之後你可能會發現一個更好,更優化的表示,但是你不能改變它,因爲你已經給了調用者直接訪問你的領域 - 他們現在依賴於它的類型。 另一方面,隱藏吸氣劑和吸附劑背後的實施細節,允許您在不破壞外部合同的情況下更改內部表示法 - 只需修改吸氣劑並且無需人知道。