BackEnd

PHPerだけどKotlinを勉強したって良いよね その2〜コンストラクタ編〜

投稿日:2018年2月15日 更新日:

はじめに

前回、PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜の続きになります。
今回はKotlinにおけるクラスのコンストラクタになります。

勉強に使った本はKotlinイン・アクション、環境はkotlincを使用しています。

コンストラクタ

Kotlinにはプライマリコンストラクタとセカンダリコンストラクタがあります。

プライマリコンストラクタ

これは以下の宣言と同じです。

  • プロパティに引数をセットするだけであれば、 init ブロックも必要ない
  • 上記の例であれば、 constructor キーワードも省略できる。
  • ただ、 val を引数につける。
  • デフォルト引数も持てる。

インスタンス化する場合は new も不要です。

クラスがスーパークラスを持つ場合は、スーパークラスも初期化する必要があります。

コンストラクタを明示的に指定しない場合は、コンパイル時にデフォルトコンストラクタが生成される。

ただし、デフォルトコンストラクタが生成されているため、このクラスを継承する場合は明示的にコンストラクタを呼び出す必要があります。
これが、継承する際にスーパークラスのクラス名の後にカッコが必要な理由のようです。

インターフェースはコンストラクタを持たないため、カッコをつける必要はありません。

セカンダリコンストラクタ

Kotlinでは複数のコンストラクタを持つことは少ないようです。
大体がプライマリコンストラクタで解決されるからです。

ただ、例えばJavaで宣言された2つのコンストラクタを持つViewクラスを考えてみます。
Kotlinだとこのように書き換えられます。

このクラスを拡張する場合、同じコンストラクタを宣言できます。

this() キーワードを使ってあるコンストラクタから自分のクラスの別のコンストラクタを呼び出すこともできます。

インターフェース内で宣言されたプロパティ

Userインターフェースを実装するクラスが、 nickname の値を取得する手段を用意する必要があります。
実際に実装してみる。

ニックネームのみを入力した人

ニックネームと email を入力した人

Facebookのアカウントで登録した人

多分どこかで定義されているであろう getFacebookName メソッドを返します。

getter、setterからバッキングフィールドにアクセスする

バッキングフィールドを参照しない場合、getter、setterを持ったプロパティをインターフェースに含めることができます。

この場合は email はサブクラスによってオーバーライドされる必要がありますが、 nickname はそのまま使えます。
バッキングフィールドを参照してしまうと、インターフェースが状態を持ってしまうのでできません。

Userクラスで、プロパティに格納されているデータが変更された場合、ログに残すようsetterを定義します。

setter、getterでは field という特別な識別子を使えます。
この field を呼ぶことで現在バッキングフィールドに格納されている値を参照できます。
getterでは値を読むことしかできないが、setter内では値の変更もできます。
またミュータブルプロパティでは、getterとsetterのどちらか一つを再定義することもできます。
バッキングフィールドへの明示的な参照とデフォルトアクセサを使用する場合、コンパイラはプロパティのバッキングフィールドを生成するようです。

アクセサの可視性

アクセサの可視性はデフォルトでプロパティと同じです。
ただし、必要に応じて可視性を変更することができます。

 

さいごに

勉強のまとめとして記載させていただきました。
次回はクラス委譲などをまとめたいと思っています。

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

laravel logo

LaravelのFacade(ファサード)とは? 何気なく使用していた裏側の仕組みを解説!

1 はじめに1.1 Facadeを使用しているクラス2 Facadeの仕組み3 Facadeの作成3.1 サンプルコードに必要な実装3.2 Serviceの作成3.3 Facadeクラスの作成3.4 ...

laravel logo

[Laravel] middlewareでHTTPリクエストの前後に処理を入れる

1 はじめに2 middlewareとは3 実装3.1 middleware作成3.2 コード実装4 middleware定義4.1 常に呼び出す4.2 特定のURLにアクセスした時のみ呼び出す4.3 ...

laravel logo

Laravelで画像アップロード実装が楽になるかもしれないlaravel-imageup

1 はじめに2 環境3 導入4 実装5 個人的にハマったこと5.1 配列はダメ5.2 PHPStanで引っかかる6 さいごに7 おすすめ書籍 はじめに こんにちは。webアプリケーションを作る際にファ ...

laravel logo

Laravel N+1検出ツールの紹介

1 はじめに2 インストール3 設定4 通知方法の追加5 テスト6 検知結果6.1 画面上アラート6.2 コンソール6.3 ログファイル7 ちなみに8 さいごに9 おすすめ書籍 はじめに DB利用した ...

Stripe Connectを使って複合プランの継続課金を実装

1 はじめに1.1 想定する継続課金1.2 想定するシチュエーション2 継続課金商品の作成2.1 プランの継続課金商品の作成2.2 ID数の継続課金商品の作成3 実装3.1 プランAとID数を30契約 ...

フォロー

blog-page_side_responsive

2018年2月
 123
45678910
11121314151617
18192021222324
25262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。