Геттер (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Метод чтения, геттер (англ. getter — получатель) — (в программировании) специальный метод, позволяющий получить данные, доступ к которым напрямую ограничен. Это один из методов объектно-ориентированного программирования, который помогает реализовать гибкий механизм инкапсуляции. В паре с сеттером (Setter) он может использоваться для организации свойств и методов в языках, где они не поддерживаются.

Примеры[править | править вики-текст]

Java[править | править вики-текст]

class Foo {
 
    private int data;
    private boolean flag;
 
    public void setData(int data) {
        this.data = data;
    }

    public int getData() {
        return data;
    }
 
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    // Для boolean свойств рекомендуется использовать префикс is, а не get
    public boolean isFlag() {
        return flag;
    }
}

C++[править | править вики-текст]

 class Foo
 {
 private:
   int m_data;
 public:
   void setData (int data)
   {
      m_data = data;
   }
   int getData () const
   {
      return m_data;
   }
 }

Delphi[править | править вики-текст]

type 
  TFoo = class
  private
    FData: Integer;
  public
    function GetData: Integer;
    procedure SetData(const ANewData: Integer);
    property Data: Integer read GetData write SetData;
  end;
 
function TFoo.GetData;
begin
  Result := FData;
end;
 
procedure TFoo.SetData(const ANewData: Integer);
begin
  FData := ANewData;
end;

В данном примере доступ к скрытому полю FData обеспечивается через методы SetData (сеттер) и GetData (геттер)

Ruby[править | править вики-текст]

  class Foo
    attr_accessor :bar # синтаксический сахар Ruby для автоматического
                       # создания getter'а и setter'а для переменной bar
  end
  
  foo = Foo.new
  foo.bar = 42  # вызов foo.bar=(42) (setter)
  foo.bar       # вызов foo.bar (getter)

Javascript[править | править вики-текст]

var Foo = function (bar) {
   this.bar = bar;
};
Foo.prototype = {
   get bar () {
      console.log('bar getter');
      return this._bar;
   },
   set bar (bar) {
      console.log('bar setter');
      this._bar = bar;
   }
};

var foo = new Foo(15);
foo.bar = 123; // bar setter
console.log(foo.bar); // bar getter, 123

PHP[править | править вики-текст]

В PHP отсутствует прямой механизм использования геттеров, поэтому их реализуют через «волшебный» метод __get()

<?php

class Foo
{
    private $data;

    public function  __get($name)
    {
        $method = 'get'.ucfirst($name);        
        if (method_exists($this, $method)) {
            return $this->$method();
        }
    }

    public function getData()
    {
        return $this->data;
    }
}

C#[править | править вики-текст]

В C# геттеры и сеттеры используются в механизме свойств. Геттеру соответствует ключевое слово get, сеттеру — set. В версии 3 появился автоматический геттер.

class Foo
{
     private int id;
     private string name;
     public int ID
     {
         get { return id; }
     }
     public string Name
     {
         get { return name; }
         set { this.name = value; }
     }
     public string SomeProperty
     {
         get;
         set;
     }
}

VB.NET[править | править вики-текст]

В VB.NET для создания геттера обязатально необходимо указать модификатор ReadOnly если не используется сеттер. Автореализуемые свойства появились начиная с VB 10.0, то есть нет необходимости писать реализацию свойства, достаточно объявления.

Public Class Foo
    Private m_Data As Integer 'Закрытое поле с данными

    Public Property Message As Integer 'Автореализуемое свойство, начиная с VB 10.0

    Public ReadOnly Property Data As Integer 'Открытое свойство только для чтения
        Get
            Return m_Data
        End Get
    End Property
End Class

Python[править | править вики-текст]

В Python геттер и сеттер класса можно сделать с помощью декоратора @property, аттрибуты, которые начинаются с __ помечаются как доступные только внутри объекта.

class Foo:
     
    def __init__(self, data=None):
        self.__data = data
           
    @property
    def data(self):
        return self.__data
     
    @data.setter
    def data(self, value):
        self.__data = value

См. также[править | править вики-текст]

Примечания[править | править вики-текст]