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入門 〜文字列と数値の操作〜

1 はじめに2 基本ルール2.1 開始と終了のタグ2.2 ホワイトスペース2.3 大文字と小文字の区別2.4 コメント2.5 変数の定義3 文字列の操作3.1 文字列の定義3.2 無駄なスペースを削除 ...

rails

Railsで複合主キーのテーブルを扱う

1 はじめに1.1 前提条件2 実装例2.1 config2.2 マイグレーション2.3 モデル3 さいごに はじめに RailsでWebサービスを開発する際のDB設計では基本的にidが主キーになると ...

laravel logo

Laravelでメールを送る

1 はじめに1.1 準備2 実装2.1 Mailableクラスの作成2.2 テンプレートの作成2.3 Mailableクラスの修正2.4 コントローラの作成2.5 コンフィグの修正3 さいごに4 おす ...

Go言語

goroutineとchannelとContext

1 はじめに2 並行処理と並列処理3 goroutine4 channel4.1 channelからデータ受信4.2 for-range でのデータ受信4.3 複数のchannelを受信4.4 buf ...

laravel logo

Laravelのバリデーションtips

1 はじめに2 配列のバリデーションでRule::uniqueを使う時のカラム名を指定したい3 配列バリデーションのエラーメッセージ制御4 カスタムバリデーションで、他の属性名を参照したい5 番外:複 ...

フォロー

follow us in feedly

blog-page_side_responsive

2018年2月
 123
45678910
11121314151617
18192021222324
25262728 

アプリ情報

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