Como getters e setters funcionam?

107

Eu sou do mundo php. Você poderia explicar o que são getters e setters e dar alguns exemplos?

ajsie
fonte
@ yegor256 Eu entendo sua analogia cachorro e bola e até a apóio, mas e quando um objeto de "organismo vivo" armazena o valor primitivo ocasional, por exemplo, um ID? E se você quiser ir um passo além da simples atribuição, mas não quiser escrever uma nova classe apenas para lidar com valores primitivos?
Jacksonkr

Respostas:

127

O tutorial não é realmente necessário para isso. Leia sobre encapsulamento

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;
}
Paul Creasey
fonte
11
portanto, getter é apenas um método para obter um campo privado e setter está definindo um novo campo. obrigado pela excelente explicação por código
ajsie
1
você poderia passar um parâmetro para um getter?
ajsie
2
noname: Não e não. Getter é uma maneira de obter um valor, mas NÃO expor o valor contido em um campo, ou seja, se você chamá- someObj.getTime().setHour(5)lo, não deve afetar someObjo estado interno de. Além disso, setters e getters (acessadores e modificadores por seus nomes mais elaborados) têm uma assinatura de método muito estrita, o que significa que getter não possui parâmetros. Métodos em geral devem fazer apenas uma coisa de qualquer maneira.
Esko
4
@noname: Quando coisas simples recebem nomes complexos / grandes / abstratos, você tem o que é chamado de "padrão de design" ... E este é um exemplo do Padrão de Explicação de Conceito Recursivo que acabei de inventar ;-)
espaço de nomes
3
@qed: a thispalavra-chave é opcional, a menos que haja um conflito com algo que tenha um escopo mais específico. No exemplo que você deu, o configurador que é criado terá um único parâmetro cujo nome corresponde ao nome do campo, portanto this.fieldName = fieldName, é usado para distinguir que o campo está sendo atribuído ao invés do parâmetro sendo atribuído a ele mesmo, como fieldName = fieldnameocorreria. Esse conflito não existe no getter.
Paul Creasey
39

Em Java, getters e setters são funções completamente comuns. A única coisa que os torna getters ou setters é a convenção. Um getter para foo é chamado getFoo e o setter é chamado setFoo. No caso de um booleano, o getter é denominado isFoo. Eles também devem ter uma declaração específica, conforme mostrado neste exemplo de um getter e setter para 'nome':

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

O motivo de usar getters e setters em vez de tornar seus membros públicos é que isso torna possível alterar a implementação sem alterar a interface. Além disso, muitas ferramentas e kits de ferramentas que usam reflexão para examinar objetos aceitam apenas objetos que possuem getters e setters. JavaBeans, por exemplo, deve ter getters e setters, bem como alguns outros requisitos.

Mark Byers
fonte
9
Esses construtores não deveriam ter 'vazio'?
Jason Hartley
O vazio é realmente necessário aqui. Se você não tiver, receberá:error: invalid method declaration; return type required
Dan
3
O vazio não é necessário aqui
Shashi Kiran
2
@JasonHartley: Um construtor não tem um tipo de retorno.
wassimans
@Mark Byers Portanto, o construtor é usado para inicializar a instância, e o setter é usado para alterar qualquer atributo dado. Isso está correto?
carloswm85 de
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);  
 }
}  

Quando você executa o programa, o programa começa na rede,

  1. objeto c é criado
  2. função setTime()é chamada pelo objeto c
  3. a variável timeé definida para o valor passado por
  4. função getTime()é chamada pelo objeto c
  5. o tempo é devolvido
  6. Vai passar tode todser impresso
user3137648
fonte
10

Você também pode querer ler " Por que os métodos getter e setter são ruins ":

Embora os métodos getter / setter sejam comuns em Java, eles não são particularmente orientados a objetos (OO). Na verdade, eles podem prejudicar a manutenção do seu código. Além disso, a presença de vários métodos getter e setter é um sinalizador vermelho de que o programa não é necessariamente bem projetado de uma perspectiva OO.

Este artigo explica por que você não deve usar getters e setters (e quando você pode usá-los) e sugere uma metodologia de design que o ajudará a romper a mentalidade getter / setter.

superfav
fonte
3

1. Os melhores getters / setters são inteligentes.

Aqui está um exemplo de javascript de mozilla:

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)

Eu usei MUITO estes porque são fantásticos . Eu iria usá-lo para obter detalhes com minha codificação + animação. Por exemplo, faça um setter que lida com um Numberque exibe aquele número em sua página da web. Quando o setter é usado, ele anima o número antigo para o novo número usando um interpolador . Se o número inicial for 0 e você configurá-lo como 10, você verá os números mudarem rapidamente de 0 para 10 ao longo de, digamos, meio segundo. Os usuários adoram essas coisas e é divertido de criar.

2. Getters / setters em php

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

citações:

Jacksonkr
fonte
2

Aqui está um exemplo para explicar a maneira mais simples de usar getter e setter em java. Pode-se fazer isso de uma maneira mais direta, mas getter e setter têm algo especial que é ao usar o membro privado da classe pai na classe filha na herança. Você pode tornar isso possível usando getter e 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();
        }

    }
Bashir ahmad
fonte
Não vou rejeitar você (não vale o esforço). Esteja ciente de que (1) Você respondeu a uma pergunta sobre Java , onde a linguagem do programa deveria estar em Java. (2) Se você deseja postar, certifique-se de que o layout seja feito corretamente. (3) Seu uso de encapsulamento (getter (ou acessador) e setters (ou mutadores)) está incorreto. Por favor, veja o que significa encapsulamento ... (Verifique a resposta votada)
KarelG
1
@KarelG desculpe, não li as tags. Eu atualizei para java. obrigado por me perceber.
Bashir ahmad