静的メソッドとフィールド
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 20/110。
インスタンスメンバと静的メンバの違いを理解したところで、静的メソッドとフィールドを効果的に使用する方法を探ってみましょう。静的メンバは、個々のオブジェクトではなく、クラスという概念自体に属する機能に最適です。
静적フィールドは、すべてのインスタンス間で共有されるデータを格納します。一般的な用途には、カウンター、設定値、またはキャッシュされたデータが含まれます。
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.circleArea(3)); // 28.27431
print(MathHelper.calculationCount); // 2静的メソッドは、インスタンスに対してではなく、クラス名に対して直接呼び出すことに注意してください。MathHelper クラスはユーティリティのように機能します。MathHelper オブジェクトを作成する必要はありません。
重要なルール:静的メソッドはインスタンスメンバに直接アクセスできません。これらは特定のオブジェクトに紐付けられていないため、this にアクセスすることはできません:
class Counter {
int value = 0; // インスタンスフィールド
static int total = 0; // 静的フィールド
void increment() {
value++; // OK - インスタンスメソッドがインスタンスフィールドにアクセス
total++; // OK - インスタンスメソッドは静的フィールドにアクセス可能
}
static void reset() {
total = 0; // OK - 静的メソッドが静的フィールドにアクセス
// value = 0; // エラー!インスタンスフィールドにはアクセスできません
}
}機能がオブジェクトの状態に依存しない場合は、静的メンバを使用してください。ユーティリティ関数、ファクトリの追跡、または共有定数が理想的な候補です。
チャレンジ
簡単オブジェクトを作成することなく、便利な機能を提供するために、静的メソッドとフィールドがどのように連携して動作するかを示す、文字列操作用のユーティリティクラスを作成しましょう。
コードを整理するために、2つのファイルを作成します:
string_utils.dart: ユーティリティヘルパーとして機能するStringUtilsクラスを定義します。クラスには以下を含める必要があります:'-'に設定されたstatic const String defaultSeparator- 実行された操作の数を追跡するために
0から開始するstatic int operationCount operationCountをインクリメントし、反転させた文字列を返す静的メソッドreverse(String text)operationCountをインクリメントし、2つの文字列をdefaultSeparatorで結合して返す静的メソッドjoin(String first, String second)operationCountをインクリメントし、母音(a, e, i, o, u - 大文字小文字を区別しない)の数を返す静的メソッドcountVowels(String text)- 実行された総操作数を示す文字列を返す静的メソッド
getStats()
main.dart: ユーティリティクラスをインポートし、その静的メソッドを使用します:'hello'を引数にreverse()を呼び出し、結果を表示します'dart'と'lang'を引数にjoin()を呼び出し、結果を表示します'Programming'を引数にcountVowels()を呼び出し、Vowels: [count]と表示しますgetStats()を使用して統計情報を表示します
これらは静的メソッドであるため、StringUtils オブジェクトを作成せずに、クラス名で直接すべてのメソッドを呼び出すことを忘れないでください。
getStats() メソッドは、次の形式で返す必要があります:
Operations performed: [operationCount]期待される出力:
olleh
dart-lang
Vowels: 3
Operations performed: 3チートシート
静的メンバは、個々のインスタンスではなくクラス自体に属します。オブジェクトではなく、クラス名を使用してアクセスします。
静的フィールドは、すべてのインスタンスで共有されるデータを格納します:
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.calculationCount); // 1アクセスルール:
- インスタンスメソッドは、インスタンスメンバと静的メンバの両方にアクセスできます
- 静的メソッドは静的メンバにのみアクセスできます(
thisへのアクセスは不可)
class Counter {
int value = 0; // インスタンスフィールド
static int total = 0; // 静的フィールド
void increment() {
value++; // OK - インスタンスメソッドがインスタンスフィールドにアクセス
total++; // OK - インスタンスメソッドが静的フィールドにアクセス可能
}
static void reset() {
total = 0; // OK - 静的メソッドが静的フィールドにアクセス
// value = 0; // エラー!インスタンスフィールドにはアクセスできません
}
}ユーティリティ関数、共有定数、カウンター、またはオブジェクトの状態に依存しない機能には、静的メンバを使用します。
自分で試してみよう
import 'string_utils.dart';
void main() {
// TODO: 'hello' を引数に reverse() を呼び出し、結果を表示する
// TODO: 'dart' と 'lang' を引数に join() を呼び出し、結果を表示する
// TODO: 'Programming' を引数に countVowels() を呼び出し、"Vowels: [count]" と表示する
// TODO: getStats() を使用して統計情報を表示する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ