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


関連記事

icon

PHP、Ruby、Pythonのfor構文を比較してみた

1 はじめに1.1 環境2 ドキュメント2.1 PHP2.2 Ruby2.3 Python3 1から100まで出力してみる3.1 PHP3.2 Ruby3.3 Python4 リスト型(配列)の出力4 ...

Go言語

Go言語のエラーハンドリングとログローテーション

1 はじめに2 エラーハンドリング2.1 error インターフェース2.2 pkg/errors パッケージ3 独自のエラータイプ付き errorsパッケージを作成4 log パッケージ4.1 lo ...

GraphQL

いまさら学ぶGraphQL〜概要編〜

1 はじめに2 GraphQLとは?2.1 なぜGraphQLは誕生した?2.1.1 過剰な取得2.1.2 過少な取得2.1.3 エンドポイントの管理3 GraphQLのメリットとデメリット3.1 G ...

laravel logo

Laravelのブラウザテスト「Dusk」をシンプルなCRUDで始めてみよう

1 はじめに2 Laravel Duskのセットアップ3 新規登録のテスト3.1 テスト対象となるコード3.2 Duskのテストコード3.3 テストの実行4 更新のテスト4.1 テスト対象となるコード ...

rails

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

フォロー

blog-page_side_responsive

2018年2月
 123
45678910
11121314151617
18192021222324
25262728  

アプリ情報

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