Menu
Coddy logo textTech

Zmienne inicjalizowane z opóźnieniem

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

Słowo kluczowe late informuje Dart, że zmienna, która nie dopuszcza wartości null, zostanie zainicjalizowana przed użyciem, mimo że nie przypisuje się jej wartości od razu. Jest to przydatne, gdy nie możesz zainicjalizować pola w deklaracji lub konstruktorze, ale masz pewność, że będzie miało wartość, zanim zostanie użyte.

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // Cześć, Alice!

Bez late Dart zgłosiłby, że username nie jest zainicjalizowane. Modyfikator late oznacza, że przypiszesz wartość, zanim ją odczytasz.

Kolejną zaletą late jest leniwa inicjalizacja. Zmienna late z inicjalizatorem nie obliczy swojej wartości, dopóki nie zostanie użyta po raz pierwszy:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // "Loading..." jest wyświetlane tutaj, a następnie "default"

Metoda loadSettings() uruchamia się dopiero przy pierwszym dostępie do settings, a nie podczas tworzenia obiektu. Uważaj jednak — dostęp do zmiennej late przed jej zainicjalizowaniem powoduje błąd wykonania.

challenge icon

Wyzwanie

Łatwy

Zbudujmy menedżera połączeń z bazą danych, który demonstruje zarówno odroczoną inicjalizację, jak i leniwą inicjalizację za pomocą zmiennych late.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • database.dart: Zdefiniuj klasę Database, która symuluje połączenie z bazą danych. Twoja klasa powinna zawierać:
    • late String connectionString, które zostanie ustawione po utworzeniu obiektu
    • late String status z leniwym inicjalizatorem, który wypisuje Checking connection... i zwraca 'Connected'
    • metodę connect(String connStr), która ustawia connectionString i wypisuje Connection configured: [connectionString]
    • metodę query(String sql), która wypisuje Executing on [connectionString]: [sql]
    • metodę checkStatus(), która wypisuje Status: [status] (to wywoła leniwą inicjalizację przy pierwszym wywołaniu)
  • main.dart: Zaimportuj swoją klasę bazy danych i zademonstruj oba zastosowania late:
    • Utwórz instancję Database
    • Wypisz Database object created
    • Wywołaj connect() z ciągiem połączenia 'localhost:5432/mydb'
    • Wywołaj query() z 'SELECT * FROM users'
    • Wywołaj checkStatus(), aby uruchomić leniwą inicjalizację

Zwróć uwagę, że connectionString jest ustawiane ręcznie po utworzeniu obiektu, podczas gdy status oblicza swoją wartość dopiero przy pierwszym dostępie.

Oczekiwany wynik:

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

Spróbuj swoich sił

import 'database.dart';

void main() {
  // TODO: Utwórz instancję Database
  
  // TODO: Wypisz 'Database object created'
  
  // TODO: Wywołaj connect() z argumentem 'localhost:5432/mydb'
  
  // TODO: Wywołaj query() z argumentem 'SELECT * FROM users'
  
  // TODO: Wywołaj checkStatus(), aby uruchomić leniwą inicjalizację
}
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