簡體   English   中英

getter 和 setter 是如何工作的?

[英]How do getters and setters work?

我來自 php 世界。 您能否解釋一下 getter 和 setter 是什么,並給您一些例子?

教程並不是真正需要的。 閱讀封裝

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

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

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. 它會傳遞給tod並且tod被打印出來

您可能還想閱讀“ 為什么 getter 和 setter 方法是邪惡的”:

盡管 getter/setter 方法在 Java 中很常見,但它們並不是特別面向對象 (OO)。 事實上,它們會損害代碼的可維護性。 此外,大量 getter 和 setter 方法的存在是一個危險信號,表明從面向對象的角度來看,程序不一定設計得很好。

本文解釋了為什么不應該使用 getter 和 setter(以及何時可以使用它們),並提出了一種設計方法,可以幫助您擺脫 getter/setter 的心態。

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,該數字在您的網頁上顯示該數字。 當使用 setter 時,它使用tweener將舊數字動畫化為新數字。 如果初始數字為 0 並且您將其設置為 10,那么您會看到數字從 0 快速翻轉到 10,比方說,半秒。 用戶喜歡這些東西,而且創造起來很有趣。

2. php中的getter/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;
  }
}
?>

引用:

這里以一個例子來解釋在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();
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM