ネストされたクラスクラスはネストできる。クラスの最も一般的な使い方は型安全な列挙。クラスのインスタンスなので初期化できる。定数はそれ自身の無名クラスを宣言することもできる。ProtoclStateクラスのメンバがこの後に続くのでその前をセミコロンで区切る。これはJavaのenumと一緒だね。メソッドが用意されている。定数は名前と位置を取得するプロパティを持っている。インターフェースを実装している。クラス内での定義順になる。オブジェクトあるクラスをちょっとだけ変更したクラスのオブジェクトを、新しいサブクラスを宣言することなしに作りたいことがある。これを無名内部クラスで扱う。この概念をオブジェクト式とオブジェクト宣言を使ってもうちょっと一般化している。オブジェクト式ある型を継承した無名クラスのオブジェクトを作るには、こう書く。}})もし親クラスがコンストラクタを持つなら、適切なパラメータを渡さなければならない。インターフェースを複数実装する場合、クラス宣言と同様にコンマで区切って指定する。15}なんも継承を指定しないオブジェクトも作れるよ。無名クラスのオブジェクトを作って渡す。この無名クラスの外側にあるclickCountにアクセスできる。valじゃなくてvarであっても。シングルトンをとても簡単に宣言できる。...}これは式ではなく宣言。何かの変数に入れて使ったりするものじゃない。使うときはこんな風に名前でアクセスできる。シングルトン取得用のメソッドを呼ばなくてもいいので楽チン。DataProviderManager.registerDataProvider(dataProvider)もちろん親を持てる。オブジェクト宣言はローカルではできない(つまり関数内ではできない)。ないクラス内では宣言できる。キーワードが付けられる。}}コンパニオンオブジェクトのメンバーはオブジェクト名を指定しないで呼びだせる。MyClass.Factory.create()とは書かない。Factoryは書かない。MyClass.create()なのでオブジェクト名は省略可能。オブジェクトそのものを取得したい場合はCompanionを指定する。メンバのように見えるけど、実行時においても実際のオブジェクトのインスタンスメンバである。インターフェースを実装できる。メソッドやフィールドとしてコンパニオンオブジェクトのメンバを生成することができる。オブジェクト式とオブジェクト宣言の意味論上の違いオブジェクト式とオブジェクト宣言には重要な意味論(semantic)上の違いがある。オブジェクト宣言は初めて利用されるときに遅延的に(lazy)初期化される。オブジェクト式はそれが使われている場所で即座に(immediately)に実行(そして初期化)される。委譲パターンは継承による実装の良い代替となることが証明されてきた1。一切の決まり切ったコードを要求することなく、ネイティブにこれをサポートする。こいつはBaseインターフェースの全てのpublicメソッドをbに委譲する。Properties)ある種のありがちな動作をするプロパティの実装をライブラリ化して、コードを共通化できたらとても素敵だと思わない?例えばこんなの。プロパティ委譲をサポートしている。後に指定したオブジェクトに委譲される。メソッドだけ持ってればいい。そのものに関する情報(ここからプロパティ名を取り出せる)。Example()println(e.p)は以下を表示する。3つ目の引数は代入する値。"NEW"は以下を表示する。Example@33a17727.プロパティ委譲の要件プロパティ委譲のまとめをここで行う。いう名前のメソッドを提供する必要がある。プロパティ保持者と同じかそのサブ型でなければならない2。KProperty<*>かそのサブ型でなければならない。戻り値はプロパティと同じ型かそのサブ型でなければならない。いう名前のメソッドを提供する必要がある。委譲クラスのメソッドか拡張メソッドとして提供される。後者はこれらのメソッドを提供していないオブジェクトにプロパティ委譲したい時に便利。キーワードでマークされている必要がある。標準ライブラリは幾つかの種類の便利な委譲を生成するファクトリメソッドを用意している。遅延プロパティを実装する委譲を提供する。呼ばれるときに渡されたブロックを実行し、その結果を覚えておく。呼ばれるたびに覚えておいた値を返す。初期値と変更を処理するラムダの2つの引数を取る。渡されたラムダはプロパティへの代入のたびに(代入が終わった後で)呼び出される。このラムダにはプロパティ情報と前の値、新しい値の3つが引数として渡される。変更のたびにこのブロックが実行される。使うと、プロパティへの代入前に渡したラムダが実行される。ラムダの戻り値は代入を行うかどうかを返す。これを使うと代入を拒否することができる。パースしたりするときに、プロパティの値をマップに入れておくことってあるよね。いう場合にはマップのインスタンスそのものを委譲先に指定できる。追加する拡張をインポートする。プロパティ名をキーにしてマップから値を返す。プロパティでも動作する。追加する拡張もインポートしてね。GO!よく言われる「継承よりコンポジションを使え」というやつ。期待してたのと違うなぁという印象。定義するのに比べて何が便利なのかわからん。パターンって言わないよね。