Menu
Coddy logo textTech

Pola final i const

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

Podczas deklarowania pól w klasie możesz użyć final lub const, aby określić, czy wartości mogą się zmieniać po inicjalizacji. Oba słowa tworzą niezmienne wartości, ale działają inaczej.

Pole final można ustawić tylko raz, ale jego wartość jest określana w czasie wykonywania programu. Możesz przypisać mu wartość w deklaracji lub za pomocą konstruktora:

class Person {
  final String name;
  final DateTime createdAt = DateTime.now();
  
  Person(this.name);
}

Person p = Person('Alice');
// p.name = 'Bob';  // Błąd: nie można ponownie przypisać wartości do pola final

name jest ustawiane podczas tworzenia obiektu, a createdAt przechowuje bieżący czas. Obie wartości są niezmienne po inicjalizacji.

Pole static const musi mieć wartość znaną w czasie kompilacji. Należy do samej klasy i jest współdzielone przez wszystkie jej instancje:

class Circle {
  static const double pi = 3.14159;
  final double radius;
  
  Circle(this.radius);
  
  double get area => Circle.pi * radius * radius;
}

Kluczowa różnica: pola final mogą przechowywać wartości obliczane w czasie działania programu (takie jak DateTime.now()), natomiast const wymaga stałych znanych w czasie kompilacji. Pola instancji nie mogą być bezpośrednio const — na poziomie klasy dozwolone jest tylko static const.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system katalogu produktów, który pokazuje różnicę między polami final i static const. Utworzysz produkty z niezmiennymi właściwościami i współdzielonymi wartościami konfiguracyjnymi.

Podzielisz kod na dwa pliki:

  • product.dart: Zdefiniuj klasę Product, która reprezentuje produkt w sklepie. Klasa powinna zawierać:
    • static const double taxRate ustawione na 0.08 (8% podatku wspólnego dla wszystkich produktów)
    • static const String currency ustawione na 'USD'
    • final String name dla nazwy produktu (ustawianej przez konstruktor)
    • final double basePrice dla ceny bazowej produktu (ustawianej przez konstruktor)
    • final String sku (jednostka magazynowa), która łączy prefiks z nazwą produktu i jest obliczana na liście inicjalizacyjnej jako 'SKU-', po którym następuje nazwa zapisana wielkimi literami
    • Konstruktor przyjmujący name i basePrice
    • Getter priceWithTax, który oblicza cenę z podatkiem
    • Metodę display(), która wyświetla informacje o produkcie
  • main.dart: Zaimportuj klasę produktu i utwórz dwa produkty:
    • 'Laptop' z ceną bazową 999.99
    • 'Mouse' z ceną bazową 29.99
    Wywołaj display() dla każdego produktu w podanej kolejności.

Metoda display() powinna wyświetlać tekst w dokładnie takim formacie:

[sku] - [name]: [basePrice] [currency] (with tax: [priceWithTax] [currency])

Podczas wyświetlania zaokrąglij priceWithTax do 2 miejsc po przecinku za pomocą toStringAsFixed(2).

Oczekiwany wynik:

SKU-LAPTOP - Laptop: 999.99 USD (with tax: 1079.99 USD)
SKU-MOUSE - Mouse: 29.99 USD (with tax: 32.39 USD)

Spróbuj swoich sił

import 'product.dart';

void main() {
  // TODO: Utwórz obiekt Product o nazwie 'Laptop' z ceną bazową 999.99
  
  // TODO: Utwórz obiekt Product o nazwie 'Mouse' z ceną bazową 29.99
  
  // TODO: Wywołaj display() dla każdego produktu po kolei (najpierw Laptop, potem Mouse)
  
}
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