1
resposta

dúvida quanto a construção dos objetos.

Entendo que alguns objetos precisam ser construidos já em um estádo válido onde alguns argumentos são passados diretos no construtor e não através de setters, minha duvida é... como ficaria um exemplo de uma classe nossa que tenha uma propriedade privada e eu preciso receber essa propriedade no construtor e não através de um setter ( porém preciso fazer uma validação antes nesse valor que chega no construtor pra saber se devo definir minha propriedade com esse valor ou se lanço uma exceção )

eu até consegui fazer aqui e tal e descobri o late das propriedades porém não ficou muito claro pra mim ,como receber um valor no construtor, fazer uma pequena validação e depois definir minha propriedade com tal valor caso esteja tudo ok

1 resposta

Bom dia Renato, vamos lá:

Um Exemplo de classe com propriedade privada, mas que precisamos inserir valores nessa classe via construtor ( em que precisamos fazer uma validação para poder usar)

Classe: Fiz uma classe de Fruta diferente, o Tomate

class Tomate{}

Parâmetro Privado Ele tem alguns parâmetros, e um deles é privado: as sementes

class Tomate{
 String? cor;
 int? quantidade;
 String gosto = 'Delicioso';
 bool? _sementes; // variável privada.
}

Construtor Alguns dos parâmetros são obtidos via construtor:

class Tomate{
 String? cor;
 int? quantidade;
 String gosto = 'Delicioso';
 bool? _sementes;
 Tomate(this.cor,this.quantidade,this._sementes);
}

Validação Existe uma função que usa o valor de sementes, e se esse valor true, devemos retirar as sementes, se for false, segue para comer.

eat(){
  if (_sementes > 0) { 
       // aqui o valor _sementes pode ser nulo, o que quebra o código
       print('Removendo $_sementes sementes ');
     }
     print('Comendo Tomate $cor');
 }

para impedir de quebrar o código devemos implementar a exception: Exception

eat() {
   if (_sementes != null) { // validação do valor de sementes
     if (_sementes! > 0) { // garanti que o _sementes é diferente de nulo usando Null Safety
       // aqui o valor _sementes pode ser nulo, o que quebra o código
       print('Removendo $_sementes sementes ');
     }
     print('Comendo Tomate $cor');
   }else{
      throw Exception('O valor das sementes é nulo');
   }
 }

Agora vamos testar! Criando e usando Tomates:

void main(){
  final tomate1 = Tomate('Vermelho', 1,15);
  final tomate2 = Tomate('Verde', 1,0);
  final tomate3 = Tomate('Preto', 1); // ta estragado
  tomate1.eat();
  tomate2.eat();
  tomate3.eat();
}

Resultado: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Não precisamos usar o Setter, pois ninguém fora da nossa classe está alterando o valor de Sementes (e o ideal é que não tenha mesmo, lembre-se do principio de responsabilidade única das Boas práticas), quem valida é nossa própria função interna! Se tivesse uma função externa para validar a gente usaria Setter e Getter, fica um desafio pra você Renato: como você implementaria isso? (Dica: cria uma classe Validator() com um método de validação que precisa verificar se a variavel que ele recebe não é nula [com getter] e depois retornar um novo valor pra ela [com Setter])