Dartのアクセス修飾子

Dartにはアクセス修飾子がありません。その代わり、メンバの名前で可視性を与えることができます。メンバの名前が_から始まるものは、いわゆるprivateな可視性となります。それ以外の名前は、いわゆるpublicな可視性となります。

例えば、以下のクラスのメンバ変数_nameはprivateなメンバ変数となり、同一ライブラリ内からのみアクセス可能です(ref. 1)。

// cat.dart
class Cat {
  String _name;

  Cat(String name) {
    _name = name;
  }
}

同一ライブラリ内からのみアクセス可能と言うのは、例えば以下のように同一ファイル内にクラスを定義した場合は、他クラスのprivateなメンバにアクセスすることができます。

// cat.dart
class Cat {
  String _name;
  String _keeper;

  Cat(String name) {
    _name = name;

    Human human = Human();
    _keeper = human._name;
  }
}

class Human {
  String _name = 'human';
}

可視性の範囲外からは、privateなメンバにはアクセスできません。

// main.dart
void main(List<String> arguments) {
  Cat cat = Cat('tama');

  //cat._name; // 不可
}

privateなメソッドも、メソッド名を_から始めて定義します。

class Cat {
  // 略
  void _toilet() {
    // do something here
  }
}

setterは隠蔽し、getterだけを公開したい時は、以下のように別途getterを定義します。

class Cat {
  String _name;
  String get name => _name;
  // 略
}

拡張メソッド(ref. 2)もprivateにすることが可能です。privateな拡張メソッドは、拡張メソッドを使いたい場所を限定したい時に使います。

extension CatExtension on Cat {
  Dog _toDog() {
    return Poodle(name: this.name);
  }
}

Reference

  1. Dart - Using Access Modifiers (Private & Public) - Woolha
  2. Dartの拡張メソッド

筆者

茨城県つくば市在住のソフトウェアエンジニアです。得意領域はAndroidとFlutterです。「Jetpack ComposeによるAndroid MVVMアーキテクチャ入門」の著者です。

👉もっと詳しく