Sobes.tech
Junior

Čo je nulová bezpečnosť (null safety) v Dart?

sobes.tech AI

Odpoveď od AI

Nulová bezpečnosť je systém v Dart, ktorý pomáha predchádzať chybám počas behu spojeným s dereferencovaním null. Kompilátor analyzuje kód a určuje, či premenná môže obsahovať hodnotu null. Ak je premenná deklarovaná ako neumožňujúca null, kompilátor zaručuje, že jej nikdy nebude priradená hodnota null.

Hlavné aspekty nulovej bezpečnosti:

  • Nezrejmý typ bez null: Predvolene typy neumožňujú null (non-nullable).
    // int nemôže byť null
    int count = 0;
    
  • Typ umožňujúci null: Pre explicitné označenie, že premenná môže byť null, sa používa otáznik ?:
    // String? môže byť null
    String? name;
    
  • Operátor ! (non-null assertion): Používa sa na potvrdenie, že výraz umožňujúci null nie je null. Je potrebné používať opatrne, pretože pri null dôjde k výnimke.
    String? nullableName = 'Flutter';
    // Používame !, vedomí si, že nullableName nie je null v tomto kontexte
    print(nullableName!.length);
    
  • Operátor ? (null-aware operátory): Používa sa pre bezpečný prístup ku členom alebo volaniam metód na výrazoch umožňujúcich null.
    • ?. (null-aware prístup):
      String? nullableString;
      // Ak nullableString nie je null, bude volaná length, inak výsledok bude null
      int? length = nullableString?.length;
      
    • ?? (ak null):
      String? serverName;
      // Ak serverName nie je null, použije sa jeho hodnota, inak 'Guest'
      String displayName = serverName ?? 'Guest';
      
    • ??= (ak null, priradiť):
      String? cache;
      // Ak cache je null, priradí sa 'Loading...'
      cache ??= 'Loading...';
      
  • Analýza toku (Flow Analysis): Kompilátor Dart analyzuje kód a určuje, kedy premenná umožňujúca null je garantovane nenull v určitej časti kódu, čo umožňuje jej použitie ako neumožňujúcej null.
    String? greeting = getGreeting();
    // Kompilátor vie, že greeting nie je null po tejto kontrole
    if (greeting != null) {
      print(greeting.toUpperCase()); // Môže byť bezpečne použitá toUpperCase()
    }
    

Výhody nulovej bezpečnosti:

  • Zníženie chýb: Predchádza NullReferenceException (alebo podobným) počas behu.
  • Vylepšená čitateľnosť: Výslovne ukazuje, či premenná môže byť null.
  • Zvýšený výkon: Kompilátor môže vykonávať optimalizácie, vedomý si, ktoré premenné sú garantovane nenull.

Nulová bezpečnosť bola zavedená v Dart 2.12.