Oop 在类中使用getter setter

Oop 在类中使用getter setter,oop,class,getter-setter,Oop,Class,Getter Setter,在任何情况下都应该使用类内某个类的getters setter吗?getters setter通常从类外从类内直接访问字段。 主要优点/用途是封装getter setter 如果getters setter有一些逻辑代码,那么就使用它 例如: public void setValue(int val){ if(val > 100) this.val = 0; else this.val = val; } 另请参见 是的,getter和setter很有用。

在任何情况下都应该使用类内某个类的getters setter吗?

getters setter通常从类外从类内直接访问字段。 主要优点/用途是封装getter setter

如果getters 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,即使它们除了这些检查之外不包含太多逻辑。

    您应该在几乎所有地方使用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;
    };
    
    看到虫子了吗<代码>转账取款,但不会增加m_取款。如果它只是调用
    draw
    而不是手动递减余额,则可以避免这种情况

    这同样适用于getter和setter。例如,具有惰性初始化其值的getter是很常见的。如果另一个成员函数试图直接访问未初始化的成员,那么您将得到一个空指针取消引用

    本质上,您应该始终尝试在getter和setter提供所需功能时使用它们。你做的低级事情越多,你就会有越多低级错误。如果不打算使用getter和setter,那么编写getter和setter是没有意义的。

    @GolezTrol

    在这个主题上并没有PHP徽章,你们错了。您所描述的与setter无关。您可以通过使用任何方法(而不仅仅是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中抛出错误无论如何都是个坏主意。从静态类型语言过渡到动态类型语言是程序员的常见错误

    setter和geter是惯例,它们不强制执行任何内容 今天,我们通常使用它们来创建普通的旧Java对象。(POJO-在php word POPO中)所以它只是创建对象的一种转换(标准),可以在库或项目之间使用

    您可以将setter与类型检查或其他任何功能结合起来,但这不会使它们比实际情况更糟糕

    关于封装:

    @org.life.java-Jigar Joshi

    “主要优点/目的是 封装getter setter,”

    @彼得·亚历山大

    “你应该用吸气剂 几乎到处都是塞特, 包括“课堂内”。如果你 如果不这样做,那么你就有可能 破坏封装“”获取程序和 setter是“封装”

    错了,错了,错了封装与getter和setter无关,这是一个非常常见的错误。我知道有很多文章一遍又一遍地颠倒着它……
    getter和setter对封装没有帮助更糟糕的是,它们可能会破坏封装。当您使用它们从对象获取一些数据时,它们会破坏封装,而不是让对象用自己的数据为您做一些事情

    封装==对象对其数据承担全部责任,不提供其行数据。私有属性上的getter只不过是以复杂的方式将该属性公开==停止封装

    Chceck段落封装:或
    关于setter或getter一个字也没有…

    @Geolez我看不到OP的PHP标签,这里描述的是OOP的概念,不是特定于任何语言的。我认为您描述的示例不是针对getter或setter的,而是封装getter和setter是封装的——这是它们的全部目的。“getter和setter是封装的。”“否:)getter和setter会破坏封装。封装==对象不在外部提供数据(属性)。@smentek:你把封装和单独限制混淆了:)不。请阅读Allen在wiki上的Holub:“通过查看代码学习设计模式:”[封装是]一种语言构造,它有助于将数据与方法(或其他函数)捆绑在一起getter和setter是绑定到类中对其数据进行操作的方法。不管怎样,我给了你a-1,因为你没有回答问题,你只是发帖骚扰其他回答者。尽管你有点急躁,但你提出了一个有趣的观点。我必须对此多读一点。谢谢。我没有错,错,错,只是我的答案可能对PHP来说太具体了。你错了,因为你不能通过使用类型暗示来强制任何类型。您的“X”提示只适用于类和数组,对于数组,仍然没有关于数组中应该包含什么的提示。当然,您也可以对其他方法执行此操作,但是因为您需要类型检查代码来确保,所以您应该始终创建一个setter并始终使用该setter,即使在该类中的方法中也是如此。但对于PHP来说,大多数其他语言都是强类型的,不需要进行额外的检查。当然,通过setter公开另一个对象的私有对象不是一个好主意,但对于更简单的类型,这应该不会是一个问题。我可以公开一个整数