應該在任何情況下使用類中的類的getters-setters嗎?在類中使用getter-setter
回答
Getters setter通常用於從外部類從內部直接訪問字段。 主要優點/目的是吸制定者封裝,
如果您的getter setter方法具有一定的邏輯代碼,然後使用它。
例如:
public void setValue(int val){
if(val > 100)
this.val = 0;
else
this.val = val;
}
另見
是,getter和setter方法是有用的。由於PHP不支持int或string等簡單類型的類型提示,因此不能強制將值設置爲正確的類型。
通過使用setter,您始終可以檢查設置的值。當設置爲int屬性的值不是int時,可以選擇對其進行類型轉換,或者引發錯誤,而不是僅僅接受錯誤的值。
這將使調試和維護應用程序變得更容易。因此,使用getter和setter是一個好主意,即使它們不包含除這些檢查以外的其他邏輯。
+ 1.這很有用,謝謝你,org.life是對的。我內含地沒有添加語言特定的標記 – 2011-01-23 22:55:29
你應該幾乎在任何地方都使用getter和setter,包括在課堂上。如果你不這樣做,那麼你有可能破壞封裝,甚至更糟的是,你可能會使你的不變量失效。
如在C++的簡單示例:
class BankAccount
{
public:
void withdraw(int amount)
{
m_balance -= amount;
m_withdrawals++;
}
void transfer(BankAcount& other, int amount)
{
m_balance -= amount;
other.m_balance += amount;
}
private:
int m_balance;
int m_withdrawals;
};
見錯誤? transfer
提款,但不會增加m_withdrawals
。如果僅僅調用withdraw
而不是手動減少餘額,則可以避免這種情況。
這同樣適用於吸氣和吸氣。例如,讓getters懶惰地初始化它們的值是很常見的。如果另一個成員函數試圖直接訪問未初始化的成員,那麼你將得到一個空指針解引用。
基本上,您應該總是嘗試使用getters和setter,只要他們提供了他們想要的功能。你做的事情越低級,你所擁有的低級別的錯誤就越多。如果你不打算使用它們,寫入getter和setter是沒有意義的。
@GolezTrol
沒有關於主題的PHP徽章,您錯了。你所描述的與setters無關。你可以通過使用任何方法而不僅僅是一個setter來強制輸入參數(在PHP中)。
你可以寫:
setX(X $x){ ...}
setY(Y $y){ ...}
或者只是:
iAmMethodNotASetter(X $x, Y $y){
//20lines of code here end then:
$this->x = $x;
$this->y = $y;
}
就像你看到的,我並不需要制定者的物體屬性來強制類型。
無論如何,在檢查變量類型後拋出setter錯誤是個壞主意。程序員從靜態語言轉換到動態類型語言是常見的錯誤。
安裝者和geters是CONVENTION,他們不執行任何操作! 今天我們通常使用它們來創建Plain Old Java Objects。 (POJO - 在php中是POPO)所以它只是一個創建對象的對話(標準),可以在圖書館或項目之間使用。
你可以結合setters與類型檢查或任何,但它不會讓他們比他們更多的東西。
關於封裝:
@ org.life.java - Jigar喬希
「的主要優點/目的是吸制定者 封裝,」
@Peter亞歷山大
「你應該使用吸氣劑 和二傳幾乎無處不在, 包括裏面的「這個類。如果您 不這樣做,那麼你可能 打破封裝」,‘getter和setter方法 是封裝’
錯,錯,錯。封裝無關與getter和setter,它是非常常見的錯誤,我知道有很多文章反覆遍歷所有顛倒...
吸氣劑和封堵器不會幫助封裝甚至更糟糕,他們可能會破壞封裝,他們這樣做,當你使用它們來獲得一些來自對象的數據,而不是要求對象用自己的數據爲你做點什麼
封裝==對象對其數據承擔全部責任並且不給它的行數據。對私人財產而言,吸氣劑不僅僅是以複雜的方式公開這種財產==剎車封裝。
Chceck段封裝:http://en.wikipedia.org/wiki/C%2B%2B或http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 甚至沒有一個字關於制定者或干將......
- 1. 如何在具有隔離範圍的角度指令中使用getterSetter?
- 2. AngularJS getterSetter向我展示函數的名稱,而不是執行它
- 3. 在包中使用java類
- 4. 在類中使用std :: set?
- 5. 在javascript中使用此類
- 6. 在類庫中使用MEF
- 7. 在Xamarin中使用ArrayList類
- 8. 在Install.php中使用Kohana類
- 9. 在Perl中使用類型
- 10. 在.NET中使用C++類
- 11. 在django中使用元類
- 12. 在類中使用向量
- 13. 在PowerShell中使用Task類
- 14. 在類中使用線程
- 15. 在類init中使用CLGeocoder()
- 16. 在Android中使用SharedPreferences類?
- 17. 在C#中使用C++類
- 18. 在Java中使用類
- 19. 在類庫中使用MEF
- 20. 在類中使用會話
- 21. 在Pygame中使用類
- 22. 在類名中使用「基」
- 23. 在類中使用Tempdata
- 24. 在Drawable類中使用onSizeChanged
- 25. 在SmallTalk中使用LinkedList類?
- 26. C#在LinkedList中使用類
- 27. 在Singleton類中使用ApplicationContextAware
- 28. 在C#中使用Java類
- 29. 在類中使用向量
- 30. 在WPF中使用基類
鏈接到其他文章解釋了這個非常好。 – Knubo 2011-01-22 10:49:11
int類型提示在PHP中不起作用。 – GolezTrol 2011-01-22 10:52:20
@Geolez我不會看OP的PHP標籤,它的OOP概念在這裏描述的不是特定於任何語言的 – 2011-01-22 10:53:10