Construtores Constantes
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 13 de 110.
Um construtor constante cria objetos constantes em tempo de compilação. Quando você cria objetos com os mesmos valores usando um construtor const, o Dart reutiliza a mesma instância na memória, melhorando o desempenho.
Para criar um construtor constante, adicione a palavra-chave const antes do nome do construtor e garanta que todas as variáveis de instância sejam final:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueTanto white quanto alsoWhite apontam para o exato mesmo objeto na memória porque foram criados com valores idênticos usando um construtor const.
Você também pode usar construtores const sem a palavra-chave const, o que cria instâncias regulares (não constantes):
var red = Color(255, 0, 0); // Instância regular
const blue = Color(0, 0, 255); // Instância constanteConstrutores constantes são comumente usados para objetos de configuração imutáveis, valores predefinidos como cores ou tamanhos, e em qualquer lugar onde você queira garantir a imutabilidade do objeto enquanto otimiza o uso de memória.
Desafio
FácilVamos construir um sistema de configuração para um jogo simples que utiliza construtores constantes para definir configurações imutáveis e reutilizáveis.
Você criará dois arquivos para organizar seu código:
difficulty.dart: Defina uma classeDifficultyque representa as configurações de dificuldade do jogo. Sua classe deve ter:- Três campos
final:name(String),enemyCount(int) eplayerLives(int) - Um construtor constante que inicializa todos os três campos
- Um método
display()que imprime as informações de dificuldade
- Três campos
main.dart: Importe sua classe de dificuldade e crie três predefinições de dificuldade constantes:easycom name'Easy',5enemies e5livesmediumcom name'Medium',10enemies e3liveshardcom name'Hard',20enemies e1life
const. Em seguida, chamedisplay()em cada um na ordem listada acima. Por fim, verifique se dois objetosconst Difficulty('Easy', 5, 5)são idênticos usandoidentical()e imprima o resultado.
O método display() deve imprimir exatamente neste formato:
[name]: [enemyCount] enemies, [playerLives] livesSaída esperada:
Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
trueFolha de consulta
Um construtor constante cria objetos constantes em tempo de compilação. Quando objetos com valores idênticos são criados usando um construtor const, o Dart reutiliza a mesma instância na memória.
Para criar um construtor constante, adicione a palavra-chave const antes do nome do construtor e garanta que todas as variáveis de instância sejam final:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}Criar instâncias constantes com valores idênticos resulta no mesmo objeto na memória:
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueConstrutores const também podem ser usados sem a palavra-chave const para criar instâncias regulares:
var red = Color(255, 0, 0); // Instância regular
const blue = Color(0, 0, 255); // Instância constanteConstrutores constantes são úteis para objetos de configuração imutáveis, valores predefinidos e para otimizar o uso de memória.
Experimente você mesmo
import 'difficulty.dart';
void main() {
// TODO: Crie três predefinições de dificuldade constantes usando a palavra-chave const:
// - easy: name 'Easy', 5 enemies, 5 lives
// - medium: name 'Medium', 10 enemies, 3 lives
// - hard: name 'Hard', 20 enemies, 1 life
// TODO: Chame display() em cada dificuldade na ordem: easy, medium, hard
// TODO: Verifique se dois objetos const Difficulty('Easy', 5, 5) são idênticos
// usando identical() e imprima o resultado
}
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
1Fundamentos de POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs EstáticosCampos Final & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository