在任何情况下,是否应该使用类中的类的getter-setter?
答案 0 :(得分:7)
Getters setter通常从外部使用,从内部直接访问字段。 主要优点/目的是getter setter的封装,
如果你的getter setter有一些逻辑代码,那么就使用它。
例如:
public void setValue(int val){
if(val > 100)
this.val = 0;
else
this.val = val;
}
另见
答案 1 :(得分:5)
是的,getter和setter很有用。因为PHP不支持类型为int或string的简单类型的类型提示,所以不能强制值为正确的类型。
通过使用setter,您始终可以检查设置的值。当设置为int属性的值不是int时,您可以选择对其进行类型转换或引发错误,而不是仅接受错误的值。
这将使调试和维护应用程序变得更加容易。因此,使用getter和setter是个好主意,即使它们除了这些检查之外不包含太多逻辑。
答案 2 :(得分:1)
@GolezTrol
主题上没有PHP徽章,你错了。你所描述的与setter无关。您可以使用任何方法强制输入参数(在PHP中),而不仅仅是setter。
你可以写:
setX( X $x ){ ...}
setY( Y $y ){ ...}
或只是:
iAmMethodNotASetter( X $x, Y $y){
//20lines of code here end then:
$this->x = $x;
$this->y = $y;
}
就像你看到我不需要setter来强制对象属性中的类型。
无论如何,在检查变量类型后在setter中抛出错误是个坏主意。从静态类型语言转换为动态类型语言的程序员常见错误。
Setter和geters是CONVENTION,它们不执行任何操作! 今天我们通常使用它们来创建Plain Old Java Objects。 (POJO - 在php word POPO中)因此它只是用于创建对象的对话(标准),可以在库或项目之间使用。
你可以将setter与类型检查或其他任何东西结合起来,但它不会使它们比它们更重要。
关于封装:
@ org.life.java - Jigar Joshi
“主要优点/目的是 吸气装置的封装,“
@Peter Alexander
“你应该使用吸气剂 几乎到处都是二传手 包括在“班级里面。如果你 不,那么你是潜在的 打破封装“”Getters和 setter是封装“
错误,错误,错误。 封装与getter和setter无关,这是非常常见的错误。我知道有很多文章一遍又一遍地重复着...... 吸气剂和固定剂无法帮助封装更糟糕,它们可能会破坏封装。当你使用它们从对象获取一些数据而不是让对象用自己的数据为你做某事时,它们会这样做。
封装==对象对其数据负全部责任,并且不给它的行数据。私有财产的吸收不仅仅是以复杂的方式公开这个财产==制动封装。
Chceck段落封装:http://en.wikipedia.org/wiki/C%2B%2B或http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 甚至没有关于制定者或吸气者的一句话......
答案 3 :(得分:0)
你应该在几乎所有地方使用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
而不是手动递减余额,则可以避免这种情况。
同样适用于getter和setter。例如,让懒惰初始化其值的getter很常见。如果另一个成员函数试图直接访问未初始化的成员,那么你将得到一个空指针解除引用。
基本上,只要提供所需的功能,就应该始终尝试使用getter和setter。你做的事情越低级别,你将会有更低级别的错误。如果你不打算使用它们,那就写下getter和setter是没有意义的。