非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

KotlinのクラスはJava/C#に慣れている僕としては違和感あるなぁ

   

kotlinを覚え始めていて、基本的な構文はだいたいわかったのでクラスについて勉強し始めましたが、JavaやC#に慣れている僕としてはKotlinのクラスの記法があまりにも省略しすぎていて怖いですね。

Kotlinは教育コストが小さいとは言われているのですが、JavaやC#に慣れている人間にはかなり違和感があります。

Android StudioではKotlinが標準言語になっているようなので慣れなければ…。

[ad#side-2]

引数がそのままプロパティに

まず↓これが成り立ってしまうのが第一の違和感。

//クラス
class Member(val name:String, var age:Int, val address:String){
}

//クラスを使う側
fun main(args: Array<String>) {
  val member1 = Member("山田太郎", 44, "東京都")
  val member2 = Member("鈴木次郎", 22, "大阪府")
    
  println(member1.name)
  println(member2.name)
}
 
//出力
//山田太郎
//鈴木次郎
 

 

クラスは値を渡しているだけで空っぽのように見えますが、使う側ではちゃんと値を呼び出せています。getterがないのは良いとしてプロパティの設定なしに引数をそのままプロパティとして呼び出せてしまうことに驚きます。「実装の隠蔽」という概念はあるのだろうか…。

 

コンストラクタは1個だけ?

コンストラクタ(Kotlinではイニシャライザと言うらしい)はinitで表します。ついでに引数以外でのプロパティも以下の通り。

class Member(val name:String, var age:Int, val address:String){
  var category : String = "???"

  init{
      category = if(age >= 40) "おっさん" else "若手"
  }
}

fun main(args: Array<String>) {
  val member1 = Member("山田太郎", 44, "東京都")
  val member2 = Member("鈴木次郎", 22, "大阪府")
    
  println(member1.category)
  println(member2.category)
}
//出力
//おっさん
//若手
 

 

Java, C#では引数を変えて複数のコンストラクタを設置できましたが、Kotlinではできないのかな?ちょっと不便かも。

 

メソッドはまあ普通…と思ったけどpublicがデフォルト

メソッドはまあ普通かなと。…と思ったら、アクセス修飾子がない場合はpublic。Java/C#はデフォルトがprivateなのでここは注意が必要です。(プロパティも同じく)

class Member(val name:String, var age:Int, val address:String){
  fun getCategory() : String{
    if(age >= 40) return "おっさん" else return "若手"
  }
}

fun main(args: Array<String>) {
  val member1 = Member("山田太郎", 44, "東京都")
  val member2 = Member("鈴木次郎", 22, "大阪府")
    
  println(member1.getCategory())
  println(member2.getCategory())
 }
//出力
//おっさん
//若手
 

 

スポンサーリンク

 - Kotlin