kotlin

kotlin基本構文-データクラス,シングルトンオブジェクト,オブジェクト式,SAM変換,コンパニオンオブジェクト,Enumクラス

投稿日:

データクラスの同値性

構造体のような用途で使うデータクラス。
プライマリコンストラクタだけで目的を達成できるからclassブロックがない。

インスタンスの同値性は「==」演算子で評価される。
データクラスには「equals」が定義済みで「==」評価時にequalsが呼ばれる。
データクラスのインスタンス同士を「==」演算子で比較すると、
プライマリコンストラクタで指定した値が同じ場合に限りtrueが返る。

データクラスの同値性はプライマリコンストラクタで定義された値だけが対象となる。
データクラスに含まれる他のメンバ変数が異なっていても、プライマリコンストラクタで
定義された値が同じであればtrueを返す。

データクラスのtoString

インスタンスの文字列化は「toString」関数が評価される。
例えば以下のような感じ。
プライマリコンストラクタで渡さなかったメンバ変数は出てこない。

データクラスのプロパティの分割

例えば、IntのPairを2つのIntに分割する書式は以下だった。

この書式において、Pairクラスのcomponent2メソッドが評価されている。
一般にcomponentN関数により左オペランドのN個の変数に代入する。
Pairの場合はcomponent2が評価され、左オペランドの2個の引数に変数が代入されている。

データクラスにおいても予めcomponentNが定義されており、
左オペランドにプライマリコンストラクタで指定した値が代入される。

データクラスの複製

copyメソッドによりインスタンスを複製できる。
その際、名前付き引数で指定した値を変更してから複製することもできる。

シングルトンオブジェクト

クラスではなくオブジェクトそのものを定義し、そのオブジェクトを使い回す書式。
以下のように書く。

オブジェクト式

クラス定義を書かないで1回限りのオブジェクトを定義するやり方。
Androidアプリを書くときに、ボタンのイベントリスナーにオブジェクトを渡す例のアレ。

以下のように書く。

btnのsetOnClickListenerにobjectという名称のオブジェクトを渡している。
objectはView.OnClickListenerインターフェースを実装していて、
onClickメソッドをオーバーライドしている。
Androidアプリを書くとコレでいっぱいになると思われる。

SAM変換

オブジェクト式で実装するインターフェースがもつ抽象メソッドが1つ
(Single Abstract Method)の場合、
overrideが必要なメソッドは1つしかないということなので、
ラムダ式でそのメソッドを書くことができる。
以下のように書く。

ラムダ式のお作法として、そのラムダ式が唯一の引数である場合はブラケットの外に出せる。
そして、ブラケットを省略できる。
さらに、ラムダ式に渡る引数の型(view:View)が明らかな場合に省略できるから以下のようになる

コンパニオンオブジェクト

kotlinにはstaticメンバーは存在しない、のだけれども、
インスタンス化されていないクラス内部のコンパニオンオブジェクトのメソッドを呼び出す、
という仕組みによって、staticメンバー相当の呼び出しができる。

下記、Personクラスのプライマリコンストラクタはprivateであって外部からインスタンス化できない。
PersonクラスはFactoryオブジェクトを内包しており、Person.getInstance()というアクセスにより、
Factory.getInstance()が呼ばれ、Personインスタンスを返す。

Enumクラス

列挙型。class予約語の前にenumで置いてclassを修飾する。
列挙子は識別子で型はない。
列挙子の型チェックはis演算子で行う。

列挙型にプロパティを持たせられる。書き方が特徴的だけれども以下の通り。
列挙子の()はSeasonのプライマリコンストラクタで、
順序数(ordinal)の他に、新たに定義したvalueをもたせている。
列挙型のプライマリコンストラクタはprivateであって、外から明示的にインスタンス化できず、
列挙する時にのみ実行される。

さらにEnumクラスにメソッドを定義できる。
列挙子の列挙と、Enumクラスのメソッド定義の間がセミコロン「;」になっている。

-kotlin
-

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.