Menu
Coddy logo textTech

Palavra-chave Late e segurança contra nulos

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 26 de 110.

Às vezes, você precisa de uma variável não anulável, mas não pode atribuir seu valor imediatamente. A palavra-chave late diz ao Dart: “Eu prometo inicializá-la antes de usá-la.”

late String description;

void setup() {
  description = 'Initialized later';
}

void main() {
  setup();
  print(description);  // Funciona - inicializado antes do uso
}

Sem late, o Dart reclamaria que description não foi inicializada. Com late, você assume a responsabilidade de garantir que ela tenha um valor antes do acesso. Se tentar lê-la antes da inicialização, ocorrerá um erro em tempo de execução.

Um caso de uso comum são cálculos dispendiosos que você deseja adiar até que sejam realmente necessários:

class DataProcessor {
  late List<int> data = _loadData();
  
  List<int> _loadData() {
    print('Loading data...');
    return [1, 2, 3, 4, 5];
  }
}

DataProcessor processor = DataProcessor();
// 'Loading data...' ainda não foi impresso
print(processor.data);  // Agora ele carrega e imprime

O método _loadData() só é executado quando data é acessado pela primeira vez, não quando o objeto é criado. Essa inicialização tardia pode melhorar o desempenho quando o valor talvez nunca seja necessário.

Use late quando tiver certeza de que uma variável será inicializada antes do uso, mas não puder fazer isso na declaração. É uma promessa ao compilador — quebre essa promessa, e seu programa travará.

challenge icon

Desafio

Fácil

Vamos criar um gerenciador de configuração que demonstra o poder das variáveis late para inicialização adiada. Você criará um sistema em que as operações de configuração dispendiosas só acontecem quando a configuração é realmente necessária.

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

  • config_manager.dart: Defina uma classe ConfigManager que gerencia as configurações da aplicação. A classe deve ter:
    • Uma String appName passada pelo construtor
    • Uma late String databaseUrl que será inicializada posteriormente por meio de um método de configuração
    • Uma late int maxConnections com inicialização lenta que imprime Calculating max connections... quando acessada pela primeira vez e retorna 100
    • Um método setupDatabase(String url) que inicializa a databaseUrl
    • Um método displayConfig() que imprime a configuração atual
  • main.dart: Importe seu gerenciador de configuração e demonstre como as variáveis late funcionam:
    • Crie um ConfigManager com o nome da aplicação 'MyApp'
    • Imprima Config created
    • Chame setupDatabase com a URL 'localhost:5432/mydb'
    • Imprima Accessing max connections...
    • Imprima o valor de maxConnections
    • Imprima Accessing max connections again...
    • Imprima o valor de maxConnections novamente (observe que a mensagem de cálculo não se repete)
    • Chame displayConfig()

O método displayConfig() deve imprimir neste formato:

--- Configuration ---
App: [appName]
Database: [databaseUrl]
Max Connections: [maxConnections]

Observe como o cálculo lento de maxConnections é executado apenas uma vez — na primeira vez que você o acessa. Esse é o benefício de late com um inicializador!

Saída esperada:

Config created
Accessing max connections...
Calculating max connections...
100
Accessing max connections again...
100
--- Configuration ---
App: MyApp
Database: localhost:5432/mydb
Max Connections: 100

Experimente você mesmo

import 'config_manager.dart';

void main() {
  // TODO: Crie um ConfigManager com o nome do app 'MyApp'
  
  // TODO: Print 'Config created'
  
  // TODO: Call setupDatabase with URL 'localhost:5432/mydb'
  
  // TODO: Print 'Accessing max connections...'
  
  // TODO: Print the value of maxConnections
  
  // TODO: Print 'Accessing max connections again...'
  
  // TODO: Print the value of maxConnections again
  // (observe que a mensagem de cálculo não se repete)
  
  // TODO: Chame displayConfig()
}
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

Pratique por conta própria: Compilador de Dart online