Sobes.tech
Junior

Co je nulová bezpečnost (null safety) v Dart?

sobes.tech AI

Odpověď od AI

Nulová bezpečnost je systém v Dart, který pomáhá předcházet chybám během běhu souvisejícím s dereferencí null. Kompilátor analyzuje kód a určuje, zda proměnná může obsahovat hodnotu null. Pokud je proměnná deklarována jako neumožňující null, kompilátor zaručuje, že jí nikdy nebude přiřazena hodnota null.

Hlavní aspekty nulové bezpečnosti:

  • Nezřejmý typ bez null: Výchozí typy neumožňují null (non-nullable).
    // int nemůže být null
    int count = 0;
    
  • Typ umožňující null: Pro explicitní označení, že proměnná může být null, se používá otazník ?:
    // String? může být null
    String? name;
    
  • Operátor ! (non-null assertion): Používá se k potvrzení, že výraz umožňující null není null. Je třeba používat opatrně, protože při null dojde k výjimce.
    String? nullableName = 'Flutter';
    // Používáme !, vědomi si, že nullableName není null v tomto kontextu
    print(nullableName!.length);
    
  • Operátor ? (null-aware operátory): Používá se pro bezpečný přístup ke členům nebo volání metod na výrazech umožňujících null.
    • ?. (null-aware přístup):
      String? nullableString;
      // Pokud nullableString není null, bude volána length, jinak výsledek bude null
      int? length = nullableString?.length;
      
    • ?? (pokud null):
      String? serverName;
      // Pokud serverName není null, použije se jeho hodnota, jinak 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (při null přiřadit):
      String? cache;
      // Pokud cache je null, přiřadí se jí 'Loading...'
      cache ??= 'Loading...';
      
  • Flow Analysis (Analýza toku): Kompilátor Dart analyzuje kód a určuje, kdy proměnná umožňující null je garantovaně nenull v určité části kódu, což umožňuje její použití jako neumožňující null.
    String? greeting = getGreeting();
    // Kompilátor ví, že greeting není null po této kontrole
    if (greeting != null) {
      print(greeting.toUpperCase()); // Může být bezpečně použit toUpperCase()
    }
    

Výhody nulové bezpečnosti:

  • Snížení chyb: Předchází NullReferenceException (nebo podobným) během běhu.
  • Vylepšená čitelnost: Výslovně ukazuje, může-li proměnná být null.
  • Zvýšený výkon: Kompilátor může provádět optimalizace s vědomím, které proměnné jsou garantovaně nenull.

Nulová bezpečnost byla zavedena v Dart 2.12.