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


関連記事

php logo

PHPでGmail APIを利用してメールデータを取得してみる その2

1 はじめに2 メールの内容取得3 MessagePartオブジェクト3.1 件名3.2 本文4 multipartの場合4.1 本文の取得5 全文6 さいごに7 おすすめ書籍 はじめに 前回は、Gm ...

php logo

PHPでGmail APIを利用してメールデータを取得してみる

1 はじめに2 Gmail API の有効化3 OAuthクライアントの作成4 Google Clientライブラリのインストール5 OAuth認証6 メールデータの取得7 さいごに8 おすすめ書籍 ...

Go言語

Go 1.18のGenericsを使った地味に便利な関数を紹介

1 はじめに2 関数の紹介2.1 解決したいこと2.2 関数の内容3 さいごに4 おすすめ書籍 はじめに 3月15日にリリースされたGo 1.18で、ついにGenericsがサポートされました(Goの ...

laravel logo

Laravelでの署名付きURL生成

1 はじめに2 今回のサンプル3 ビュー4 ルーティング5 コントローラー5.1 署名付きURLの生成5.2 期限ありの署名付きURLの生成5.3 署名のチェック6 おまけ6.1 署名の仕組7 さいご ...

laravel logo

Laradock環境にPHPStormからXdebugする

1 はじめに2 Laradock側の設定変更2.1 xdebug.iniファイル2.2 .env2.3 コンテナの再構築3 PHPStormの設定3.1 Preferences3.1.1 Build, ...

フォロー

blog-page_side_responsive

2018年2月
 123
45678910
11121314151617
18192021222324
25262728  

アプリ情報

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