吸气器和吸气器如何工作?


107

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


@ yegor256我理解您的狗狗和狗的类比,甚至支持它,但是当“生物”对象存储偶然的原始值(例如ID)时会怎么样?如果您想超越简单的分配而又不想只写一个处理原始值的新类怎么办?
杰克逊(Jacksonkr)

Answers:


127

并不是真的需要教程。阅读封装

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

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;
}

11
因此,getter只是获取私有字段的方法,而setter则要设置一个新字段。感谢您的代码出色的解释
ajsie

1
您可以将参数传递给吸气剂吗?
ajsie 2010年

2
noname:不,不。Getter是获取值但不公开字段中包含的值的方式,也就是说,如果调用someObj.getTime().setHour(5)它,则不应影响someObj的内部状态。此外,setter和getter (访问者和mutator的别名)也具有非常严格的方法签名,这意味着getter没有任何参数。一般而言,方法只能做一件事。
Esko 2010年

4
@noname:当简单的事物被赋予复杂/大/抽象名称时,您就有所谓的“设计模式”...。这就是我刚发明的递归概念解释模式的一个示例;-)
namespaceform

3
@qed:this关键字是可选的,除非与具有更特定范围的内容冲突。在您给出的示例中,创建的设置器将只有一个参数,其名称与字段名称匹配,因此this.fieldName = fieldName,用来区分是将字段分配给自己,而不是将参数分配给自己fieldName = fieldname。吸气剂中不存在此类冲突。
Paul Creasey 2013年

39

在Java中,getter和setter是完全普通的函数。使他们成为getter或setter的唯一原因是约定。foo的getter称为getFoo,setter称为setFoo。如果是布尔型,则该吸气剂称为isFoo。它们还必须具有特定的声明,如本示例的“名称”的获取器和设置器所示:

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以及其他一些要求。


9
这些构造函数不应该没有“ void”吗?
杰森·哈特利2014年

在这里实际上需要空隙。如果没有,您会得到:error: invalid method declaration; return type required
2014年

3
这里不需要空隙
Shashi Kiran 2015年

2
@JasonHartley:构造函数没有返回类型。
wassimans's

@Mark Byers因此,构造函数用于初始化实例,而setter用于更改任何给定的属性。这样对吗?
carloswm85

12
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);  
 }
}  

当您运行程序时,程序将在主电源中启动,

  1. 创建对象c
  2. 函数setTime()由对象c调用
  3. 变量time设置为传递的值
  4. 函数getTime()由对象c调用
  5. 时间返回
  6. 它会过去todtod打印出来

10

您可能还想阅读“ 为什么getter和setter方法是邪恶的 ”:

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

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


3

1.最好的吸气器/吸气器是聪明的。

这是来自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以便在您的网页上显示该数字。当使用二传手它动画的老号码使用新号码中间人。如果初始数字为0,并将其设置为10,那么您会看到数字从0迅速翻转到10,即半秒。用户喜欢这些东西,创建它很有趣。

2. PHP中的获取器/设置器

sof的例子

<?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;
  }
}
?>

引用:


2

这是一个示例,说明在Java中使用getter和setter的最简单方法。可以用一种更直接的方式做到这一点,但是getter和setter有一些特殊之处,那就是在继承中在子类中使用父类的私有成员时。您可以通过使用getter和setter使其成为可能。

package stackoverflow;

    public class StackoverFlow 

    {

        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) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

我不会投票给你(不值得付出努力)。请注意:(1)您回答了Java问题,其中程序语言为Java。(2)如果要发布,请确保正确完成布局。(3)您使用的封装(getter(或访问器)和setter(或mutators))不正确。请查看封装的含义...(检查表决的答案)
KarelG

1
@KarelG对不起,我没有阅读标签。我将其更新为Java。感谢您认识我。
巴希尔·艾哈迈德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.