112

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

4

6 回答 6

129

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

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;
}
于 2010-01-10T12:27:05.547 回答
39

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

于 2010-01-10T12:26:23.113 回答
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打印出来
于 2014-01-25T04:51:05.777 回答
10

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

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

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

于 2010-01-10T18:33:28.443 回答
3

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

引用:

于 2016-01-06T16:56:15.683 回答
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();
        }

    }
于 2017-05-18T08:22:05.557 回答