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
89
スマートスピーカーのすゝめ
okinari
0
70
最近のNAS製品事情
okinari
0
110
Flutterで簡単なアプリを作ってみる
okinari
0
43
Webマーケティングとは?
okinari
0
54
エンジニアにも知ってほしいWebマーケティングの世界
okinari
2
400
データ収集のすゝめ
okinari
1
320
FlutterをWEBエンジニアが扱ってみたお話
okinari
0
480
Other Decks in Technology
See All in Technology
VPCでもFloatingIPを使いたいんだ
y_kotani
1
130
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
Digitization部 紹介資料
sansan33
PRO
2
7.8k
AWSとGitHub Actionsの責任境界と 組織で安全に使用する取り組み
nealle
1
220
1000⼈規模のClaude Enterprise運⽤を「Oktaのグループ」と「Slack」に集約する
sansantech
PRO
1
500
atproto spaces概要
yamarten
0
110
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
480
Claude Codeの体系的な理解と知識のフック
oikon48
8
6k
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
830
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
1
640
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
13
9.1k
OAuth SPIFFE Client Authentication(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
350
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
So, you think you're a good person
axbom
PRO
2
2.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Six Lessons from altMBA
skipperchong
29
4.5k
Product Roadmaps are Hard
iamctodd
55
12k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
250
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
Building Adaptive Systems
keathley
44
3.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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)