Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンストラクタ、知ってますよね?

okinari
January 23, 2019

 コンストラクタ、知ってますよね?

okinari

January 23, 2019
Tweet

More Decks by okinari

Other Decks in Technology

Transcript

  1. これもコンストラクタ class Point { num x, y, o; Point(this.x, this.y);

    Point.onlineX(this.x): this.y = 0 { print('On the X line.'); } Point.onlineY(this.y): this.x = 0 { print('On the Y line.'); } Point.origin(): this(0, 0); }
  2. コンストラクタの種類 (多すぎるよ…) ・Default constructors ・Named constructors ・Redirecting constructors ・Constant constructors

    ・Factory constructors ・Initializer list(※) ※コンストラクタの種類ではない 引用元:公式のLanguage Tourより https://www.dartlang.org/guides/language/language-tour#constructors
  3. class Point { int x, y; Point(this.x, this.y); Point.n(this.x, this.y,

    int n) { print(n); } } Default constructors ・コンストラクタに限り、  引数でインスタンス変数を  変更可能 ・追加の引数はもちろんOK ・内部で処理を書くのもOK
  4. Named constructors class Point { num x, y; Point(); Point.pConstructor()

    { this.x = 0; this.y = 0; } static Point pMethod() { Point point = new Point(); point.x = 0; point.y = 0; return point; } } void main() { // コンストラクタ Point.pConstructor(); // staticメソッド Point.pMethod(); } // どちらもPointオブジェクトが // 取得できる
  5. ・ファクトリーコンストラクタ ・常に新しくインスタンスを  作成するとは限らない場合、  factoryを使うべし?  - ファクトリーパターン?  - シングルトンパターン? ・Loggerなど…(例が思いつかん) シングルトンパターンと

    ファクトリーパターンの違いに混乱 … Factory constructors class Logger { final String name; static final Map<String, Logger> _cache = <String, Logger>{}; Logger._internal(this.name); factory Logger(String name) { if (_cache.containsKey(name)) { return _cache[name]; } else { final logger = Logger._internal(name); _cache[name] = logger; return logger; } } }
  6. Factory constructors factory Logger(String name) { if (_cache.containsKey(name)) { return

    _cache[name]; } else { final logger = Logger._internal(name); _cache[name] = logger; return logger; } }
  7. Factory constructors static Logger getInstance(String name) { if (_cache.containsKey(name)) {

    return _cache[name]; } else { final logger = Logger._internal(name); _cache[name] = logger; return logger; } }