2011-01-22 108 views

回答

7

Getters setter通常用于从外部类从内部直接访问字段。 主要优点/目的是吸制定者封装

如果您的getter setter方法具有一定的逻辑代码,然后使用它。

例如:

public void setValue(int val){ 
    if(val > 100) 
    this.val = 0; 
    else 
    this.val = val; 
    } 

另见

+0

链接到其他文章解释了这个非常好。 – Knubo 2011-01-22 10:49:11

+0

int类型提示在PHP中不起作用。 – GolezTrol 2011-01-22 10:52:20

+0

@Geolez我不会看OP的PHP标签,它的OOP概念在这里描述的不是特定于任何语言的 – 2011-01-22 10:53:10

5

是,getter和setter方法是有用的。由于PHP不支持int或string等简单类型的类型提示,因此不能强制将值设置为正确的类型。

通过使用setter,您始终可以检查设置的值。当设置为int属性的值不是int时,可以选择对其进行类型转换,或者引发错误,而不是仅仅接受错误的值。

这将使调试和维护应用程序变得更容易。因此,使用getter和setter是一个好主意,即使它们不包含除这些检查以外的其他逻辑。

+0

+ 1.这很有用,谢谢你,org.life是对的。我内含地没有添加语言特定的标记 – 2011-01-23 22:55:29

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而不是手动减少余额,则可以避免这种情况。

这同样适用于吸气和吸气。例如,让getters懒惰地初始化它们的值是很常见的。如果另一个成员函数试图直接访问未初始化的成员,那么你将得到一个空指针解引用。

基本上,您应该总是尝试使用getters和setter,只要他们提供了他们想要的功能。你做的事情越低级,你所拥有的低级别的错误就越多。如果你不打算使用它们,写入getter和setter是没有意义的。

1

@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%2Bhttp://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 甚至没有一个字关于制定者或干将......