Menu
Coddy logo textTech

Słowo kluczowe late a bezpieczeństwo wartości null

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 26 z 110.

Czasami potrzebujesz zmiennej, która nie dopuszcza wartości null, ale nie możesz od razu przypisać jej wartości. Słowo kluczowe late mówi Dartowi: „Obiecuję zainicjalizować tę zmienną, zanim jej użyję”.

late String description;

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

void main() {
  setup();
  print(description);  // Działa – zainicjalizowano przed użyciem
}

Bez late Dart zgłosiłby, że zmienna description nie została zainicjalizowana. Używając late, bierzesz na siebie odpowiedzialność za to, by przed dostępem do niej miała wartość. Jeśli spróbujesz ją odczytać przed zainicjalizowaniem, wystąpi błąd wykonania.

Częstym przypadkiem użycia są kosztowne obliczenia, które chcesz odłożyć do momentu, gdy będą rzeczywiście potrzebne:

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

DataProcessor processor = DataProcessor();
// 'Loading data...' nie zostało jeszcze wypisane
print(processor.data);  // Teraz dane są ładowane i wypisywane

Metoda _loadData() uruchamia się dopiero przy pierwszym dostępie do data, a nie podczas tworzenia obiektu. Ta leniwa inicjalizacja może poprawić wydajność, gdy wartość może nigdy nie być potrzebna.

Używaj late, gdy masz pewność, że zmienna zostanie zainicjalizowana przed użyciem, ale nie możesz tego zrobić podczas jej deklaracji. To obietnica składana kompilatorowi — złam ją, a program ulegnie awarii.

challenge icon

Wyzwanie

Łatwy

Zbudujmy menedżer konfiguracji, który pokaże możliwości zmiennych late w zakresie odroczonej inicjalizacji. Utworzysz system, w którym kosztowne operacje konfiguracyjne będą wykonywane tylko wtedy, gdy konfiguracja będzie rzeczywiście potrzebna.

Podzielisz kod na dwa pliki:

  • config_manager.dart: Zdefiniuj klasę ConfigManager, która obsługuje ustawienia aplikacji. Klasa powinna zawierać:
    • String appName przekazane przez konstruktor
    • late String databaseUrl, które zostanie zainicjalizowane później za pomocą metody konfiguracji
    • late int maxConnections z leniwą inicjalizacją, która przy pierwszym dostępie wypisuje Calculating max connections... i zwraca 100
    • Metodę setupDatabase(String url), która inicjalizuje databaseUrl
    • Metodę displayConfig(), która wypisuje bieżącą konfigurację
  • main.dart: Zaimportuj menedżer konfiguracji i pokaż, jak działają zmienne late:
    • Utwórz obiekt ConfigManager z nazwą aplikacji 'MyApp'
    • Wypisz Config created
    • Wywołaj setupDatabase z adresem URL 'localhost:5432/mydb'
    • Wypisz Accessing max connections...
    • Wypisz wartość maxConnections
    • Wypisz Accessing max connections again...
    • Ponownie wypisz wartość maxConnections (zauważ, że komunikat o obliczaniu nie pojawia się ponownie)
    • Wywołaj displayConfig()

Metoda displayConfig() powinna wypisywać dane w następującym formacie:

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

Zauważ, że leniwe obliczanie wartości maxConnections odbywa się tylko raz — przy pierwszym dostępie do niej. To właśnie zaleta użycia late z inicjalizatorem!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'config_manager.dart';

void main() {
  // TODO: Utwórz ConfigManager z nazwą aplikacji 'MyApp'
  
  // TODO: Wypisz 'Config created'
  
  // TODO: Wywołaj setupDatabase z adresem URL 'localhost:5432/mydb'
  
  // TODO: Wypisz 'Accessing max connections...'
  
  // TODO: Wypisz wartość maxConnections
  
  // TODO: Wypisz 'Accessing max connections again...'
  
  // TODO: Wypisz ponownie wartość maxConnections
  // (zwróć uwagę, że komunikat o obliczaniu nie pojawia się ponownie)
  
  // TODO: Wywołaj displayConfig()
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online