Menu
Coddy logo textTech

静的メソッドとフィールド

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;  // エラー!インスタンスフィールドにはアクセスできません
  }
}

機能がオブジェクトの状態に依存しない場合は、静的メンバを使用してください。ユーティリティ関数、ファクトリの追跡、または共有定数が理想的な候補です。

challenge icon

チャレンジ

簡単

オブジェクトを作成することなく、便利な機能を提供するために、静的メソッドとフィールドがどのように連携して動作するかを示す、文字列操作用のユーティリティクラスを作成しましょう。

コードを整理するために、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() を使用して統計情報を表示する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン