getter 和 setter 是如何工作的?

Posted

技术标签:

【中文标题】getter 和 setter 是如何工作的?【英文标题】:How do getters and setters work? 【发布时间】:2011-01-03 11:09:15 【问题描述】:

我来自 php 世界。您能否解释一下什么是 getter 和 setter,并给您一些例子?

【问题讨论】:

@yegor256 我理解你的狗和球类比,我什至支持它,但是当“活的有机体”对象存储偶尔的原始值(例如 ID)时呢?如果您想超越简单的赋值,但又不想编写一个只处理原始值的新类怎么办? 【参考方案1】:

教程并不是真正需要的。阅读encapsulation

private String myField; //"private" means access to this is restricted to the class.

public String getMyField()

     //include validation, logic, logging or whatever you like here
    return this.myField;

public void setMyField(String value)

     //include more logic
     this.myField = value;

【讨论】:

所以 getter 只是一种获取私有字段的方法,而 setter 是设置一个新字段。感谢代码的精彩解释 你能把参数传给getter吗? noname:没有也没有。 Getter 是获取值但不暴露字段中包含的值的方法,也就是说,如果您调用someObj.getTime().setHour(5),它不应该影响someObj 的内部状态。此外,setter 和 getter (访问器和 mutator 的名称更奇特) 具有非常严格的方法签名,这意味着 getter 没有任何参数。无论如何,一般方法应该只做一件事。 @noname:当简单的事物被赋予复杂/大/抽象的名称时,你就有了所谓的“设计模式”……这是递归概念解释模式的一个例子,我只是发明;-) @qed:this 关键字是可选的,除非与具有更具体范围的内容发生冲突。在您给出的示例中,创建的 setter 将有一个参数,其名称与字段名称匹配,因此 this.fieldName = fieldName 用于区分该字段被分配给而不是参数被分配给其自身作为 @ 987654327@ 将实现。 getter 中不存在这样的冲突。【参考方案2】:

在 Java 中,getter 和 setter 是完全普通的函数。使它们成为 getter 或 setter 的唯一因素是约定。 foo 的 getter 称为 getFoo,而 setter 称为 setFoo。在布尔值的情况下,getter 称为 isFoo。它们还必须有一个特定的声明,如“name”的 getter 和 setter 示例所示:

class Dummy

    private String name;

    public Dummy() 

    public Dummy(String name) 
        this.name = name;
    

    public String getName() 
        return this.name;
    

    public void setName(String name) 
        this.name = name;
    

使用 getter 和 setter 而不是公开您的成员的原因是它可以在不更改接口的情况下更改实现。此外,许多使用反射检查对象的工具和工具包只接受具有 getter 和 setter 的对象。 JavaBeans 例如必须具有 getter 和 setter 以及其他一些要求。

【讨论】:

那些构造函数不应该没有'void'吗? 这里实际上需要void。如果你没有,你会得到:error: invalid method declaration; return type required 这里不需要空 @JasonHartley:构造函数没有返回类型。 @Mark Byers 因此,构造函数用于初始化实例,而设置器用于更改任何给定的属性。这是正确的吗?【参考方案3】:
class Clock   
        String time;  

        void setTime (String t)   
           time = t;  
          

        String getTime()   
           return time;  
          
  


class ClockTestDrive   
   public static void main (String [] args)   
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 
  

当你运行程序时,程序在电源中启动,

    对象 c 已创建 函数setTime()被对象c调用 变量time设置为传递的值 函数getTime()被对象c调用 时间返回 它将传递给todtod 被打印出来

【讨论】:

【参考方案4】:

您可能还想阅读“Why getter and setter methods are evil”:

尽管 getter/setter 方法在 Java 中很常见,但它们并不是特别面向对象 (OO)。事实上,它们会损害代码的可维护性。此外,大量 getter 和 setter 方法的存在是一个危险信号,从 OO 的角度来看,该程序不一定设计得很好。

本文解释了为什么不应该使用 getter 和 setter(以及何时可以使用它们),并提出了一种设计方法,可以帮助您摆脱 getter/setter 思维方式。

【讨论】:

【参考方案5】:

1。最好的 getter/setter 很聪明。

这是一个来自 mozilla 的 javascript 示例:

var o =  a:0  // `o` is now a basic object

Object.defineProperty(o, "b",  
    get: function ()  
        return this.a + 1; 
     
);

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

我经常使用这些,因为它们很棒。当我喜欢我的编码+动画时,我会使用它。例如,制作一个处理 Number 的设置器,它会在您的网页上显示该数字。当使用 setter 时,它使用tweener 将旧数字动画化为新数字。如果初始数字是 0 并且您将其设置为 10,那么您会看到数字从 0 快速翻转到 10,比方说半秒。用户喜欢这些东西,而且创造起来很有趣。

2。 php中的getter/setter

来自软的例子

<?php
class MyClass 
  private $firstField;
  private $secondField;

  public function __get($property) 
    if (property_exists($this, $property)) 
      return $this->$property;
    
  

  public function __set($property, $value) 
    if (property_exists($this, $property)) 
      $this->$property = $value;
    

    return $this;
  

?>

引用:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get http://tweener.ivank.net/ Getter and Setter?

【讨论】:

【参考方案6】:

这里有一个例子来解释在java中使用getter和setter的最简单的方法。可以用一种更直接的方式做到这一点,但是 getter 和 setter 有一些特殊的地方,那就是在继承的子类中使用父类的私有成员时。您可以通过使用 getter 和 setter 来实现。

package ***;

    public class *** 

    

        private int x;

        public int getX()
        
            return x;
        

        public int setX(int x)
        
          return  this.x = x;
        
         public void showX()
         
             System.out.println("value of x  "+x);
         


        public static void main(String[] args) 

            *** sto = new ***();
            sto.setX(10);
            sto.getX();
            sto.showX();
        

    

【讨论】:

我不会对你投反对票(不值得付出努力)。请注意 (1) 您回答了一个Java 问题,其中程序语言应该 使用 Java。 (2) 如果要发布,请确保布局正确。 (3)您对封装(getter(或访问器)和setter(或mutators))的使用不正确。请查一下封装是什么意思……(查看投票答案) @KarelG 抱歉,我没有阅读标签。我将它更新为java。谢谢你认识我。

以上是关于getter 和 setter 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 v-model 中为基于类的组件使用 getter 和 setter?

IDE 不显示 Lombok 为 Jackson 注释类生成的 getter 和 setter

c ++中的getter/setter是正确的方法吗?

为啥在使用扩展语法复制对象后 getter/setter 不再工作?

Getter 和 Setter 方法

为啥 getter/setter 在 vue typescript 类组件中无法正常工作