应该在任何情况下使用类中的类的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. 在C#中使用C++类
- 3. 在Xamarin中使用ArrayList类
- 4. 在类中使用jQuery
- 5. 在Perl中使用类型
- 6. 在类中使用会话
- 7. 在Python中使用java类
- 8. 在PowerShell中使用Task类
- 9. 在类名中使用“基”
- 10. 在C#中使用Java类
- 11. 在AsyncTask类中使用ProgressDialog
- 12. 在Singleton类中使用ApplicationContextAware
- 13. 在@Embeddable类中使用@Embedded
- 14. 在类库中使用Application.Run
- 15. 在Ubuntu中使用com.sun.media.sound.javasoundaudioclip类?
- 16. 在Pygame中使用类
- 17. 在.NET中使用C++类
- 18. 在类库中使用MEF
- 19. 在c#中使用vb.net类
- 20. 在SmallTalk中使用LinkedList类?
- 21. 使用子类在Android中
- 22. 在包中使用java类
- 23. 在Android中使用SharedPreferences类?
- 24. 在类中使用std :: set?
- 25. 在类中使用mixin
- 26. 在类中使用ifstream
- 27. 在类中使用NSMutableArray
- 28. 在PHP中使用COM类
- 29. 在类中使用鼠标
- 30. 在类中使用线程
链接到其他文章解释了这个非常好。 – 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