型安全なコレクション
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 64/110。
型を指定せずにコレクションを作成すると、Dartは初期値からその型を推論します。しかし、空のコレクションが必要な場合や、特定の型のみを追加できるようにしたい場合はどうすればよいでしょうか?そこで型注釈の出番です。
山括弧の中に型パラメータを追加することで、その型の要素のみを受け入れる型安全なコレクションを作成できます。
List<String> names = [];
names.add('Alice');
names.add('Bob');
// names.add(42); // エラー: intをList<String>に追加することはできません
Set<int> numbers = {1, 2, 3};
Map<String, double> prices = {'apple': 1.99, 'banana': 0.99};これは、独自のクラスを使用する場合に特に強力になります。特定のオブジェクト型のみを保持するコレクションを作成できます。
class User {
String name;
User(this.name);
}
void main() {
List<User> users = [];
users.add(User('Alice'));
users.add(User('Bob'));
for (User user in users) {
print(user.name); // Dartは各アイテムがUserであることを認識しています
}
}コンパイラはコードが実行される前に型の不一致を検出し、コレクション要素を操作する際に完全なオートコンプリートのサポートを受けることができます。これはジェネリクスの基礎であり、今後のレッスンで詳しく学習していきます。
チャレンジ
簡単型安全なコレクションの力を実証する製品在庫システムを構築しましょう。Productクラスと、型付きコレクションを使用して製品の管理、カテゴリの追跡、価格情報の保存を行うInventoryクラスを作成します。
コードを2つのファイルに整理します:
product.dart: 以下の内容を持つProductクラスを定義します:String nameプロパティString categoryプロパティdouble priceプロパティ- これら3つのプロパティすべてを初期化するコンストラクタ
main.dart: 製品ファイルをインポートし、型安全なコレクションを使用するInventoryクラスを作成します:- すべての製品を順番に保存するための
productsという名前のList<Product> - 一意のカテゴリ名を追跡するための
categoriesという名前のSet<String> - 製品名で価格を素早く検索するための
priceByNameという名前のMap<String, double>
- 製品を3つのコレクションすべてに適切に追加する
addProduct(Product p)メソッド - 在庫の概要を出力する
printSummary()メソッド
main()関数内では:Inventoryのインスタンスを作成します- 以下の製品を順番に追加します:
- カテゴリ
'Electronics'、価格999.99の'Laptop' - カテゴリ
'Electronics'、価格149.99の'Headphones' - カテゴリ
'Kitchen'、価格79.99の'Coffee Maker' - カテゴリ
'Office'、価格4.99の'Notebook'
- カテゴリ
printSummary()を呼び出します
- すべての製品を順番に保存するための
printSummary()メソッドは、製品数を出力し、すべてのユニークなカテゴリをリストし、価格検索マップを表示する必要があります。各コレクションタイプが特定の目的にどのように役立っているかに注目してください。Listは製品オブジェクトを順番に保持し、Setは重複するカテゴリを自動的に処理し、Mapは迅速な価格検索を提供します。
期待される出力:
Total products: 4
Categories: {Electronics, Kitchen, Office}
Price lookup: {Laptop: 999.99, Headphones: 149.99, Coffee Maker: 79.99, Notebook: 4.99}自分で試してみよう
import 'product.dart';
// TODO: 次の構成で Inventory クラスを作成してください:
// - List<Product> products - すべての商品を順番に保存する
// - Set<String> categories - 重複のないカテゴリ名を追跡する
// - Map<String, double> priceByName - 商品名で価格を検索する
class Inventory {
// TODO: 3つの型指定されたコレクションを宣言してください
// TODO: コレクションを初期化するコンストラクタを作成してください
// TODO: addProduct(Product p) メソッドを実装してください
// - 商品を products リストに追加する
// - カテゴリを categories セットに追加する
// - 名前と価格を priceByName マップに追加する
// TODO: printSummary() メソッドを実装してください
// - 商品の総数を出力する
// - すべてのカテゴリを出力する
// - 価格検索マップを出力する
}
void main() {
// TODO: Inventory インスタンスを作成してください
// TODO: 次の商品を順番に追加してください:
// 1. 'Laptop'、カテゴリ 'Electronics'、価格 999.99
// 2. 'Headphones'、カテゴリ 'Electronics'、価格 149.99
// 3. 'Coffee Maker'、カテゴリ 'Kitchen'、価格 79.99
// 4. 'Notebook'、カテゴリ 'Office'、価格 4.99
// TODO: printSummary() を呼び出してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ