在任何情况下都应该在类中使用类的 getters-setter 吗?
4 回答
获取器设置器通常用于从外部类从内部直接访问字段。主要优点/目的是封装getter setter,
如果您的 getter setter 有一些逻辑代码,请使用它。
例如 :
public void setValue(int val){
if(val > 100)
this.val = 0;
else
this.val = val;
}
另见
是的,getter 和 setter 很有用。因为 PHP 不支持像 int 或 string 这样的简单类型的类型提示,所以不能强制一个值是正确的类型。
通过使用设置器,您始终可以检查设置的值。当设置为 int 属性的值不是 int 时,您可以选择对其进行类型转换或引发错误,而不仅仅是接受错误的值。
这将使调试和维护您的应用程序变得更加容易。因此,使用 getter 和 setter 是一个好主意,即使它们除了这些检查之外不包含太多逻辑。
@GolezTrol
没有关于主题的 PHP 徽章,你错了。您所描述的与二传手无关。您可以使用任何方法(不仅是 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 中抛出错误是个坏主意。这是从静态类型语言过渡到动态类型语言的程序员的常见错误。
Setter 和 geters 是 CONVENTION,他们不强制执行任何事情! 今天我们通常使用它们来创建普通的旧 Java 对象。(POJO - 在 php 单词 POPO 中)所以它只是一个用于创建可以在库或项目之间使用的对象的约定(标准)。
您可以将 setter 与类型检查或其他任何东西结合起来,但它不会使它们变得比它们更重要。
关于封装:
@org.life.java - Jigar Joshi
“主要优点/目的是封装 getter setter,”
@彼得亚历山大
“你应该几乎在任何地方都使用 getter 和 setter,包括在类内部。如果你不这样做,那么你可能会破坏封装”“getter 和 setter 是封装”
错,错,错。封装与 getter 和 setter 无关,这是很常见的错误。我知道有很多文章一遍又一遍地颠倒重复......
getter 和 setter 无助于封装,更糟糕的是,它们可能会破坏封装。当您使用它们从对象获取一些数据而不是要求对象使用自己的数据为您做某事时,它们会这样做。
封装 == 对象对其数据负全部责任,并且不给它的行数据。私有财产的吸气剂只不过是以复杂的方式公开该财产==制动封装。
检查段落封装:http ://en.wikipedia.org/wiki/C%2B%2B或http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 甚至没有一个关于 setter 或 getter 的词...
您应该几乎在任何地方都使用 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 是没有意义的。