Kotlin/Kotlin相違点
新しいKotlinプロジェクトを作成したら、Androidアプリのテンプレートがついてきたので、ちょっと上から順に眺めてみることにしました。
package
packageの宣言のあたりはjavaと一緒なのかー、って思いきや、まず文末のセミコロンがないですね。セミコロンは省略可能で、つけない勢が多いようです。JavaScriptも省略可能ですよね。ただつける期間が長かったせいか、まだセミコロンつける派が多い印象です。Pythonなんかも基本つけないイメージです。Rustだとつけないと値を返そうとするので挙動が変わっちゃいますね。
import
import文もあんまりjavaと変わらない印象です。
class
class MainActivity : AppCompatActivity() {}
classの宣言文はextendsがコロンに変わってる!?継承親のAppCompatActivityの後ろにカッコもついてます。classのコンストラクタの表現方法がいくつかあって、丸括弧の説明は後回しにします。interfaceもカンマで続けるスタイルらしき情報をどっかでみました。
変数
private var _binding: FragmentFirstBinding? = null
変数はvarを付けて宣言するそうです。javascriptっぽい!それで不変(書き換えしない)なものはvalをつけて宣言するようです。javascriptにletとconstが導入されたときのことを思い出します。あんな感じで書き換えるか書き換えないかを明示していくのが今時なんですかね。Rustだとmut修飾子がつくかどうかで変わりますね。これ変数が書き換わるかどうかをコンパイラがチェックしてくれるんだと思いますが、それ以上に計算機的に何かメリットがあるんですかね?メモリの節約にでもなるのかな?あと定数と同じなのか、書き換えできないけど変数なのかってとこで似て非なる扱いになりそうですね。javascriptみたいなインタプリタ方式だと関係なさそうですが、javaみたいに中間言語を吐くやつはまた違うのかな?
private修飾子は変わりなさそう。
変数につける型情報はTypeScriptみたいにコロンと一緒に後置するんですね。ActionScriptを思い出したのでECMAScriptの作法なのかな?そしてなんといっても型情報の最後についた?マークが見どころですね。Nullableって呼ばれるnull値を代入できるかどうかをこの?マークで表現しているんですよね~。javaは基本的にNullableってことになるのかな。そして大量のNullPointerExceptionが生み出されてきわけですよね。Nullableかどうかを明示できるとこれが解消できるかもしれないってアイディアなんですね~。
private val binding get() = _binding!!
この辺になってくるパッと見てわかりませんでした。とりあえず文末の「!!」マークは代入時に値がnullだったらNullPointerException例外を送れってことだそうです。
この行は変数(binding)にgetterを設定しているってことのようです。実態は _bindingだけど、_bindingがnullだったら例外を吐かせるというgetterですかね。getterって呼んでますけど、正式名称なんでしょう。getXXみたいなメソッドを書くのが嫌になったらこの書き方を覚えようと思いました。なお、getterがあればsetterももちろんあるようです。
メソッド
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {}
メソッドの定義時にはfunとつけるようです。javascriptはfunctionの8文字をむやみやたらとタイプしなくちゃでトラウマになっている人もいるといいますが、funなら3文字でいいですね。perlのsubと同じくらいいいです。rustのfnにはちょっと負けますけど。
親クラスのメソッドを上書きするときはoverride をつけるようです。javaの@Override アノテーションなんかよりこっちの方が慣れてていいかも。
override fun onCreateOptionsMenu(menu: Menu): Boolean {}
メソッドの返り値の型情報は波括弧の前にコロンと一緒につけるようです。型情報は基本後置系なんですね。
super
親クラスをsuperで表すのは一緒みたいです。
when
whenは初めて予約キーワードとしてみたかもしれません。switch文の兄弟みたいなもんですよね。Rustでもmatch文がでてきたときに思いましたが、旧来のswitch文ってbreakするのが億劫になるんですよね。あとswitch文自体が値を返さないので、あくまでも条件分岐の一形態でしかありあせんでした。
return when (x) { 1 -> true else -> false }
whenだとその辺の表現力が上がりますね。
ラムダ式
{ a, b -> a.length() < b.length() }
匿名関数とかラムダとか正しい用語の定義は知らないですが、関数型プログラミングの隆盛もあって関数自体がオブジェクトとしてやりとりされるのが、今風ですよね。perlはずっと昔からやってたけど。型付き言語でそれをやるとなるといろいろ考えなきゃならないんだと思いますが、新しめの言語では初めから設計に入っているのでスムーズに導入できますね。アロー演算子で引数と処理とをつないで、波括弧で囲えばいいのかな。
とりあえず、気になった点を列挙してみました。