昨日、オンライン動画学習サービスのSchooさんの生放送授業に出演しました。
Android開発言語にKotlinが正式に仲間入りというニュースがきっかけで、初めてKotlinを知ったという開発者も多くいらっしゃると思います。 そのような人たちのために、サクっとKotlin紹介みたいなノリで1時間お話しさせていただきました。
小さい勉強会でのLTから大きなカンファレンスでの講演まで数多く経験してきて、人前でしゃべることには緊張こそすれ慣れているつもりでした。 しかし「生放送」というものは初めての経験だったので、勝手がわからず緊張しているのかリラックスしているのか、よくわからないテンションで臨みました。
普通の勉強会は、聴衆の反応を直接感じることができ、臨機応変に振る舞えるものだと思います。 要は軌道修正やそのタイミングの察知が容易なのかなぁと。
一方、生放送という形は、リアルアイムで視聴者のコメントが届き、ある程度の反応はわかるものの、「楽しんでもらえてるかな?」とか「難しすぎないかな?」という不安を話しながら感じていました。 とはいえ、ネットを介すことでコメントや質問がしやすいようにも思えます。 リアル勉強会では最後の質問コーナーで、挙手して皆の前で質問する人は決して多くないのではないかと思います(多くても質問の数は3個とか4個)。 昨日の生放送では、20個くらいは質問をいただけたと思います。
特に主張したいことはないのですが、初めての形態での情報発信をできたことを純粋に楽しめたし、私自身 非常に勉強になりました!
いただいた質問を詳しく回答
いただいた質問に対して丁寧に回答したつもりでしたが、プログラミング言語のことなので、やはり言葉だけでは伝わりづらい部分もあるのだと思います。 なので、コードを添えて回答したいと思ったものを、この場で解説します。
Q. データクラスのプロパティの妥当性検証はできるのか?
できます。 Kotlinのクラスには「イニシャライザ」というものがあり、ここでインスタンス生成に関する事前条件の検証等を行います。
例えば人物を表すクラスPerson
を考えます。次のような実装になるものとします。
data class Person(val name: String, val age: Int)
このような実装ですと、次のように年齢に負数をセットすることができてしまいます。
val taro = Person("Taro", -1)
このような不正な状態のインスタンスを生成したくありません。
そこで「イニシャライザ」の登場です。
クラスPerson
を、次のように書き直します。
data class Person(val name: String, val age: Int) { init { if (age < 0) throw IllegalArgumentException("ダメ") } }
この新しいPerson
のインスタンスを生成するときにPerson("Taro", -1)
とコンストラクタを呼び出すと、例外がスローされます。
不正な状態のインスタンスを生成することを防げた、というわけです。
ちなみに、このような事前条件の検証を行うための便利な関数が標準ライブラリに含まれています。 それを使って書き直すと、こうなります。
data class Person(val name: String, val age: Int) { init { require(age >= 0, {"ダメ"}) } }
Q. データ隠蔽はできるか?
できます。 Kotlinのプロパティへのアクセスは一見、内部データに直接アクセスしているように見えますが、違います。 内部データは「バッキングフィールド」という形で保持しますが、外部からこれを直接触ることはできません。 すなわち内部データと、それへのアクセスを提供する窓口は別に提供されます。 デフォルトでデータ隠蔽できているのです。
class Foo { val foo = "Foo" }
Foo().foo //=> Foo
プロパティfoo
へのアクセスは、内部データを直接見ているような感じがします(Javaに慣れている人なら特に)。
しかし、実はそうではないことを、次のコードで確認することができます。
class Foo { val foo: String = "Foo" get() { println("fooを返します") return field } }
Foo().foo // fooを返します // Foo
field
は暗黙の変数で、カスタムゲッターやカスタムセッターの中でのみアクセス可能です。
このfield
が内部データの正体です。外の世界からこいつに接触することはできません。
ひとこと
「髪短くしたね!」って言われるのを期待しているのに「黒くなったね!」とよく言われます。