6
3

More than 5 years have passed since last update.

DartでConstructorの引数と本文の間に式をかける件について

Last updated at Posted at 2018-03-07

DartでConstructorの引数と本文の間に式をかけることがわかりづらいそうなので簡単に説明します。
本文という言い方が正しいのかどうか知らないですが、ここでは波カッコから波カッコの間のことです。

main
class Lion {
  String name;
  double feet;

  Lion(this.name) : feet = 6.0 {
    //              ↑これなんだ?
  }
}

Dartではfinalフィールドをコンストラクタの本文で初期化することが許可されていません。

error1
class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter){
    feet = meter * 3.28;
    // error: 'feet' can't be used as a setter because it is final.
  }
}

なので、このようにコンストラクタの本文が始まる前に初期化を終えておきましょう。

ok1
class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 {

  }
}

superで親コンストラクタの呼び出すときも、本文には書けません。

class Lion extends Animal {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 {
        super(8);// ←エラー
  }

}

正解はこちら。

class Lion extends Animal {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meter * 3.28 , super(8) {
  }

}

ちなみに、引数と本文の間でインスタンスメソッドは使えないです。staticにしましょう。
ただ、あまりにも複雑になるならfactoryコンストラクタを使ったほうがいいかもです。


class Lion {
  String name;
  final double feet;

  Lion(this.name, double meter) : feet = meterToFeet(meter) {}

  // ↓static は必須。インスタンスメソッドは↑で使えない。
  static double meterToFeet(double meter) {
    return meter * 3.28;
  }
}

Javaでコンストラクタのfinalフィールドを初期化するときのルールが結構多いことをご存知の方は存在意義わかっていただけると思います。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3