getter和setter如何工作?

时间:2010-01-10 12:20:36

标签: java setter getter

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

6 个答案:

答案 0 :(得分:125)

这并非真正需要教程。阅读encapsulation

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

答案 1 :(得分:37)

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

答案 2 :(得分: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. 调用
  4. 变量time设置为
  5. 传递的值
  6. 函数getTime()由对象c
  7. 调用
  8. 返回时间
  9. 它将传递给todtod打印出来

答案 3 :(得分:8)

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

  

尽管getter / setter方法在Java中很常见,但它们并不是特别面向对象(OO)。实际上,它们可能会损害代码的可维护性。此外,许多getter和setter方法的存在是一个红旗,该程序不一定是从OO的角度设计好的。

     

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

答案 4 :(得分:2)

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)

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

2。 php中的getters / setter

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

citings:

答案 5 :(得分:1)

这是一个例子来解释在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();
        }

    }