【Flutter/Dart】クラス・メンバ名の前にあるアンダースコア(_)とは?

今回はクラスまたはメンバ(プロパティ・メソッド)の名前の前にある「アンダースコア(_)」とは何かについて紹介します。

結論としてはDartにおける「アンダースコア(_)」は「private」であることを示し、外部ファイルでの使用を制限できます。

\ 世界最大級のオンライン学習サービス /

目次

privateとは?別ファイルでの使用が制限される

class _Book {
  String _title;

  _Book(this._title);
}
import 'book.dart';

main() {
  var book = _Book('Harry Potter');
}

//結果
//Error: Method not found: '_Book'.

まずは上記コード(2つのdartファイル)を使いながら「private」とは何かについて解説します。

Dartではクラス名の前にアンダースコア(_)を付けることで外部ファイルでの使用(import文あり)を制限できます。よってbook.dartでprivateとして定義した_Bookクラスはmain.dartで使用できません。

メンバ(プロパティ・メソッド)も同様に制限できる

class Book {
  String _title;

  Book(this._title);

  void _secretBook() {
    print('秘密の本は$_title');
  }
}
import 'book.dart';

main() {
  var book = Book('Harry Potter');
  print(book._title);
  print(book._secretBook);
}

//結果
//Error: The getter '_title' isn't defined for the class 'Book'.
//Error: The getter '_secretBook' isn't defined for the class 'Book'.

先ほどはクラスをprivate化したので次はpublicなクラスでプロパティ・メソッドをprivate化してみます。

すると同様にアンダースコア(_)をつけたプロパティとメソッドを外部ファイルで使用する(そもそもできない)とエラーが発生します。

外部ファイルでprivate変数を取得するには?

class Book {
  String _title;

  Book(this._title);

  get title => _title;
}
import 'book.dart';

main() {
  var book = Book('Harry Potter');
  print(book.title);
}

//結果
//Harry Potter

外部ファイルでprivate変数(プロパティ)を取得したい場合はGetterを使用します。

またSetterを使用してprivate変数の値を更新することも可能です。

一緒に読みたい

参考

  • URLをコピーしました!
目次