Menu
Coddy logo textTech

Getters e Setters

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 21 de 110.

Getters e setters fornecem uma maneira de acessar e modificar campos de classe por meio de métodos especiais que se parecem com propriedades comuns. Em vez de expor os campos diretamente, você pode controlar como os valores são lidos e gravados.

Um getter é definido usando a palavra-chave get e retorna um valor computado ou armazenado:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

Observe que area e perimeter são acessados como campos, mas são calculados a cada vez. Não são necessários parênteses.

Um setter usa a palavra-chave set e permite que você controle como um valor é atribuído:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

O setter valida a entrada antes de armazená-la e pode até converter entre unidades. Isso lhe dá controle sobre seus dados, mantendo uma sintaxe limpa e semelhante a uma propriedade para os usuários da sua classe.

challenge icon

Desafio

Fácil

Vamos construir um rastreador de pontuação para um jogo que utiliza getters e setters para gerenciar as estatísticas do jogador com validação e valores computados.

Você organizará seu código em dois arquivos:

  • player.dart: Defina uma classe Player que rastreia o desempenho de um jogador no jogo. Sua classe deve ter:
    • Um campo String name para o nome do jogador
    • Um campo privado int _score começando em 0
    • Um campo privado int _lives começando em 3
    • Um construtor que recebe o nome do jogador
    • Um getter score que retorna a pontuação atual
    • Um setter score que aceita apenas valores de 0 ou maiores (ignore valores negativos)
    • Um getter lives que retorna as vidas atuais
    • Um setter lives que aceita apenas valores entre 0 e 5 inclusive (ignore valores fora desta faixa)
    • Um getter level que computa o nível do jogador baseado na pontuação: pontuação dividida por 100 (divisão inteira), mais 1
    • Um getter isAlive que retorna true se as vidas forem maiores que 0
    • Um método displayStatus() que imprime o status atual do jogador
  • main.dart: Importe sua classe de jogador e demonstre os getters e setters:
    • Crie um jogador chamado 'Alex'
    • Defina a pontuação para 250 e chame displayStatus()
    • Tente definir a pontuação para -50 (deve ser ignorado) e chame displayStatus()
    • Defina as vidas para 1 e chame displayStatus()
    • Tente definir as vidas para 10 (deve ser ignorado) e chame displayStatus()

O método displayStatus() deve imprimir exatamente neste formato:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

Saída esperada:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

Folha de consulta

Getters e setters fornecem acesso controlado aos campos da classe por meio de métodos especiais que se parecem com propriedades comuns.

Getter - definido usando a palavra-chave get, retorna um valor calculado ou armazenado:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0 - acessado como um campo, sem parênteses
print(rect.perimeter); // 16.0

Setter - usa a palavra-chave set, controla como os valores são atribuídos:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

Setters podem validar a entrada e converter entre unidades, mantendo uma sintaxe limpa, semelhante a uma propriedade.

Experimente você mesmo

import 'player.dart';

void main() {
  // TODO: Crie um jogador chamado 'Alex'

  // TODO: Defina o score para 250 e chame displayStatus()

  // TODO: Tente definir o score para -50 (deve ser ignorado) e chame displayStatus()

  // TODO: Defina lives para 1 e chame displayStatus()

  // TODO: Tente definir lives para 10 (deve ser ignorado) e chame displayStatus()
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos