Operatory ? i !
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 25 z 110.
Podczas pracy z typami dopuszczającymi wartość null Dart udostępnia dwa niezbędne operatory bezpiecznego dostępu do wartości. Operator dostępu uwzględniający null ?. i operator asercji non-null ! pozwalają kontrolować sposób obsługi wartości, które mogą być null.
Operator ?. bezpiecznie uzyskuje dostęp do właściwości lub metod wartości dopuszczającej null. Jeśli wartość to null, całe wyrażenie zwraca null zamiast powodować awarię:
String? name = 'Alice';
print(name?.length); // 5
name = null;
print(name?.length); // null (bez awarii!)Operator ! mówi Dart: „Mam pewność, że ta wartość nie jest null”. Zmienia typ dopuszczający null na typ niedopuszczający null, ale zgłasza błąd, jeśli wartość faktycznie jest null:
String? maybeName = 'Bob';
String definite = maybeName!; // OK - stwierdzamy, że nie jest null
print(definite.length); // 3
String? empty = null;
// String crash = empty!; // Błąd wykonania! Wartość była nullUżywaj ?., gdy chcesz bezpiecznie obsługiwać wartości null. Używaj ! tylko wtedy, gdy masz całkowitą pewność, że wartość istnieje — na przykład po sprawdzeniu jej za pomocą instrukcji if albo gdy wiesz, że logika gwarantuje istnienie wartości. Nadmierne używanie ! niweczy cel bezpieczeństwa null i może prowadzić do awarii w czasie działania.
Wyzwanie
ŁatwyStwórzmy system ewidencji produktów, który pokaże, jak bezpiecznie pracować z wartościami dopuszczającymi null przy użyciu operatorów ?. i !.
Utworzysz dwa pliki, aby uporządkować swój kod:
product.dart: Zdefiniuj klasęProduct, która reprezentuje produkt w ewidencji. Niektóre produkty mają kompletne informacje, a inne są jeszcze katalogowane. Twoja klasa powinna zawierać:- Niedopuszczające null
String name— każdy produkt musi mieć nazwę - Niedopuszczające null
double price— każdy produkt musi mieć cenę - Dopuszczające null
String? description— niektóre produkty nie mają jeszcze opisu - Dopuszczające null
String? category— niektóre produkty nie zostały jeszcze przypisane do kategorii - Konstruktor, który przyjmuje
nameipricejako wymagane parametry - Metodę
getDescriptionLength(), która zwraca długość opisu przy użyciu?.lubnull, jeśli nie ma opisu - Metodę
getCategoryUppercase(), która zwraca kategorię wielkimi literami przy użyciu!— ta metoda zakłada, że kategoria została ustawiona - Metodę
displayProduct(), która wyświetla informacje o produkcie, pokazującNo description, gdy opis ma wartość null, orazUncategorized, gdy kategoria ma wartość null
- Niedopuszczające null
main.dart: Zaimportuj klasę produktu i pokaż działanie obu operatorów:- Utwórz produkt o nazwie
'Laptop'i cenie999.99, a następnie ustaw jego opis na'High-performance computing device'i kategorię na'Electronics' - Utwórz produkt o nazwie
'Mystery Item'i cenie49.99(pozostaw opis i kategorię jako null) - Dla Laptopa: wywołaj
displayProduct(), wyświetlDescription length: [length]przy użyciugetDescriptionLength()i wyświetlCategory: [uppercase]przy użyciugetCategoryUppercase() - Dla Mystery Item: wywołaj
displayProduct()i wyświetlDescription length: [length]przy użyciugetDescriptionLength()(pojawi sięnull)
- Utwórz produkt o nazwie
Metoda displayProduct() powinna wyświetlać informacje w następującym formacie:
Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]Oczekiwany wynik:
Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: nullSpróbuj swoich sił
import 'product.dart';
void main() {
// TODO: Utwórz produkt o nazwie 'Laptop' i cenie 999.99
// Następnie ustaw jego opis na 'High-performance computing device'
// I ustaw jego kategorię na 'Electronics'
// TODO: Utwórz produkt o nazwie 'Mystery Item' i cenie 49.99
// Pozostaw opis i kategorię jako null
// TODO: Dla produktu Laptop:
// - Wywołaj displayProduct()
// - Wypisz "Description length: [length]", używając getDescriptionLength()
// - Wypisz "Category: [uppercase]", używając getCategoryUppercase()
// TODO: Dla produktu Mystery Item:
// - Wywołaj displayProduct()
// - Wypisz "Description length: [length]", używając getDescriptionLength()
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online