Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンストラクタ、知ってますよね?
Search
okinari
January 23, 2019
Technology
130
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コンストラクタ、知ってますよね?
okinari
January 23, 2019
More Decks by okinari
See All by okinari
AWS Lambda(+API Gateway)でバイナリを扱う話
okinari
0
120
僕の家からリモコンが消えた話(NatureRemoについて)
okinari
0
90
スマートスピーカーのすゝめ
okinari
0
71
最近のNAS製品事情
okinari
0
110
Flutterで簡単なアプリを作ってみる
okinari
0
44
Webマーケティングとは?
okinari
0
55
エンジニアにも知ってほしいWebマーケティングの世界
okinari
2
400
データ収集のすゝめ
okinari
1
320
FlutterをWEBエンジニアが扱ってみたお話
okinari
0
480
Other Decks in Technology
See All in Technology
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
240
ClaudeCodeでセキュリティ監視業務を半自動化_1年の運用でわかったAIに任せる設計の5つのポイント
kintotechdev
4
1k
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
130
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
180
Claude Teamプランの コスト最適化を考える
rfdnxbro
2
870
hookで自作する Claude Code の「実況ボード」
shinyasaita
2
290
LLMアプリ、 雰囲気で運用してませんか? 〜LLMOpsの現在地〜
taka_aki
1
660
tamachi.goを支える技術
rymiyamoto
0
130
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
100
Digitization部 紹介資料
sansan33
PRO
2
7.8k
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
0
1.5k
Sony-DroidKaigi2026
sony
0
220
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Designing Experiences People Love
moore
143
24k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Designing Powerful Visuals for Engaging Learning
tmiket
1
520
Discover your Explorer Soul
emna__ayadi
2
1.3k
Darren the Foodie - Storyboard
khoart
PRO
3
3.8k
Odyssey Design
rkendrick25
PRO
2
790
How to Talk to Developers About Accessibility
jct
2
530
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
Transcript
コンストラクタ 知ってますよね?
Self-introduction Name: okinari Twitter: @okinari Job: Web Engineer(Marketing Engineer) Interested:
Dart / Flutter / Elixir / Node.js
コンストラクタとは? オブジェクト指向のプログラミング言語で 新たなオブジェクトを生成する際に呼び出されて 内容の初期化などを行なう関数あるいはメソッドのことである。 引用元:Wikipedia https://ja.wikipedia.org/wiki/コンストラクタ あんまり説明いらないですよね …
こういうのを イメージしてますよね? ※スライド中のコードは 動かないかもしれないので、 ご注意ください。 コンストラクタと言えば… class Hoge { String
bar; Hoge(String foo) { this.bar = foo; } }
これもコンストラクタ 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); }
“もう笑うしかないよ
コンストラクタの種類 (多すぎるよ…) ・Default constructors ・Named constructors ・Redirecting constructors ・Constant constructors
・Factory constructors ・Initializer list(※) ※コンストラクタの種類ではない 引用元:公式のLanguage Tourより https://www.dartlang.org/guides/language/language-tour#constructors
・標準コンストラクタ ・要は普通のやつ Default constructors class Point { num x, y;
Point(num x, num y) { this.x = x; this.y = y; } }
class Point { int x, y; Point(this.x, this.y); Point.n(this.x, this.y,
int n) { print(n); } } Default constructors ・コンストラクタに限り、 引数でインスタンス変数を 変更可能 ・追加の引数はもちろんOK ・内部で処理を書くのもOK
・名前付きのコンストラクタ ・C++とかにはあるらしい? - 僕は初めて知りました ・呼び出し時、staticメソッド との見分けがつかない Named constructors class Point
{ num x, y; Point(this.x, this.y); Point.origin() { x = 0; y = 0; } }
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オブジェクトが // 取得できる
・別のコンストラクタへ リダイレクト ・リダイレクトなので、 追加の処理はできない ・別のコンストラクタと、 共通の処理がある場合は、 メソッドを使う必要がある Redirecting constructors class
Point { num x, y; Point(this.x, this.y); Point.alongXAxis(num x) : this(x, 0); }
・定数コストラクタ ・final以外のフィールドは 定義不可 Constant constructors class Point { static final
Point origin = const Point(0, 0); final num x, y; const Point(this.x, this.y); }
・ファクトリーコンストラクタ ・常に新しくインスタンスを 作成するとは限らない場合、 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; } } }
Factory constructors factory Logger(String name) { if (_cache.containsKey(name)) { return
_cache[name]; } else { final logger = Logger._internal(name); _cache[name] = logger; return logger; } }
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; } }
・staticメソッドで 同じように書けるような…? ・コンストラクタとの違いは (たぶん)呼び出し方だけ ・staticメソッドの場合、 メソッド名が必須なので、 名無しで表現するには、 factoryコンストラクタが必須 - 通常のコンストラクタ風
Factory constructors void main() { Logger loggerFactory = Logger('name'); Logger loggerStaticMethod = Logger.getInstance('name'); }
Initializer list ・初期化リスト? ・変数を初期化する ・右辺に同じクラスの メソッドを使う場合、 staticメソッドのみ使用可 ・finalフィールドを宣言時と コンストラクタ引数以外で 初期化できる方法
class Point { int x, y; Point(Map<String, num> json) : this.x = json['x'], this.y = json['y'] { print('call Point($x, $y);'); } }
まとめ(感想) ・コンストラクタの書き方はたくさんあるから 注意しよう! ・(Flutterの場合)オブジェクト生成にて画面を 構築するので、その簡易化が目的(かも?) ・それにしても多すぎない…?
Thanks! ご質問などあれば、 下記までお願いします。 @okinari (Twitter)