Androidアプリ開発にまだJavaを使っていますか?Kotlinへの移行が簡単である理由と始め方
ここ数年でKotlinは大きなブレイクを果たし、あらゆる場面で話題となり、その人気は今も上昇し続けています。そして、GoogleがKotlinをAndroidアプリ開発の公式言語として採用したことも正式に発表されています。
それにもかかわらず、Android開発では依然としてKotlinよりもJavaを選ぶ開発者が多くいます。なぜでしょうか?主な理由の一つは、メインで使う言語をJavaからKotlinへ変更することへの抵抗感です。人はどうしても新しいものへの変化を恐れてしまうものです。
今すぐKotlinを使い始める、簡単な方法
実際には、JavaからKotlinへの切り替えはとても簡単です。Kotlinは非常に柔軟な言語なので、慣習的な「Kotlinらしい」書き方ではなく、まるでJavaのようなスタイルでコードを書くこともできます。

ここからは、JavaからKotlinへ移行する際に知っておくべきポイントを紹介します。
1. Javaとの相互運用性
KotlinはJavaと完全な相互運用性を持ち、その逆も同様です。つまり、KotlinのコードからJavaのコードを呼び出せるということです。これによりアプリの移行が非常に容易になります。すでにJavaで半分コードを書いてしまった場合でも問題ありません。そのままKotlinで続きを書けばいいのです。
2. プリミティブ型がなくなった
JavaでintにするかIntegerにするかで半日悩んだ経験はありませんか?Kotlinにはプリミティブ型が存在せず、すべてがオブジェクトとしてラップされています。
3. 文法が少し変わった(でも心配いりません、すぐ慣れます)
変数、関数、クラス宣言などの構文が少し変更されましたが、Javaのようなオブジェクト指向プログラミング(OOP)の経験があれば、それほど問題にはなりません。また、voidキーワードとセミコロン(';')が廃止されました。セミコロンがなくなったことには感謝ですね!!
Androidクラスを使った基本的な例を紹介します。
//継承と実装は「:」を使用する
class BasicActivity : AppCompatActivity() {
//変数宣言は変数名が先、型が後
var a :Int = 10 //varは可変
val b :Int = 15 //valは不変
/*初期値なしで非プリミティブ型を宣言する場合は
lateinitキーワードが必要*/
lateinit var someTextView:TextView
//newキーワードも不要
var gameList:List<Integer> = ArrayList()
//オーバーライドはoverrideキーワードを使用
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_basic)
}
}
4. 型推論
Kotlinは変数の型推論を提供することで、開発をぐっと楽にしてくれます。
var a = 5 //自動的に整数型と推論される
var b = "John" //自動的にString型と推論される
5. Null安全チェック
KotlinはNullPointerExceptionを回避するためにnull安全性チェックを提供しています。nullを返す可能性のある変数には、?記号を付ける必要があります(必須)。
var a:String? = null
var b:String = null //許可されない さらに、NullPointerException(Javaにおける「10億ドルの過ち」)を避けるためのnull安全呼び出しも用意されています。
//許可されない:aはnullの可能性がある
a.function()
//これはNullPointerExceptionをスローせず、処理が続行される
a?.function()
//強制呼び出し:NPEを引き起こす可能性あり。値が100%nullでないと確信できる場合のみ使用
a!!.function()6. staticキーワードがなくなった
staticキーワードはObjectキーワードに置き換えられました。クラスとメソッドの両方に適用され、メソッドの場合はより具体的にはCompanion Objectを使用します。
7. switch文がwhenに進化
switch caseは新しいキーワード「when」に置き換えられました。よりクリーンで柔軟な記述が可能になります。
when (x) {
1 -> println("One")
2 -> print("Two")
else -> print("Others")
}8. 検査例外がなくなった
Javaで何らかの操作やキャストを行ったとき、赤い警告が出て例外チェックの追加を求められた経験はありませんか?Kotlinではこれが廃止されました。IDEが例外処理を強制することはもうありません!!
以上が、Kotlinでの開発を始めるために必要なポイントです(ただし、書き方はJava風のままでも構いません)。Kotlinへの入門は難しくないと思いませんか?KotlinはJavaとそれほど変わらないものに見えてきたはずです。
Kotlinが提供する主な機能

KotlinとJavaの違いを見てきたところで、次はKotlinが提供する機能と、少しずつ「Kotlinらしい」書き方へステップアップする方法について見ていきましょう。
1. 柔軟性
Kotlinが愛される最大の理由の一つは、この言語の柔軟性です。OOP純粋主義者ですか?今話題の関数型プログラミングを試したくてうずうずしていますか?なんと、Kotlinでは両方が可能です!関数型プログラミングのすべての機能を完全に網羅しているわけではありませんが、十分にサポートしています。
2. ラムダサポート
そう、Java 8でもラムダがサポートされていることはご存じでしょう。しかし、Kotlinの方が先にこれを実現しており、非常に優れた出来栄えです。確かに、ラムダ関数への移行は最初は難しく感じるかもしれませんが、前述の通りKotlinは非常に柔軟です。さあ、使い方はあなた次第です!
一部のAndroidライブラリもラムダをサポートしています。例えばView.OnClickListener(Android開発の経験があれば、このメソッドにはすでに非常になじみがあるはずです)。
val randomButton : Button
//ラムダ関数を引数として使用
randomButton.setOnClickListener{v -> doRandomStuff(v) }3. データクラス
KotlinはModel/Entityクラスの代替として「データクラス」を提供しています。冗長なsetter/getterが不要になり、equalsメソッドやtoString関数も内蔵されているため、自分で実装する必要がありません。利用も非常に簡単です。
data class Person(
val id:String,
val name:String = "John Doe" //デフォルト値
)
//初期化ブロック
var person = Person("id","Not John")4. 拡張関数
Kotlinは拡張関数の使用を許可しており、コードの可読性が向上します。また、クラス自体を修正することなく、既存のクラスに機能を追加できます。
fun Int.superOperation(anotherInt:Int):Int {
val superNumber = this * anotherInt + anotherInt
return superNumber
}
//このように関数を呼び出せる
val someNumber = 5
val superNumber = someNumber.superOperation(10) //655. 名前付き引数とデフォルト引数
C#と同様に、Kotlinもメソッドの名前付き引数とデフォルト引数をサポートしています。すべての引数に値を渡す必要がなくなり、変更したい値だけを指定すればOK!同じ特定の値を10回の関数呼び出しごとに渡す手間はもうありません!
//関数宣言
fun someOperations(var x: Int, var y:Int, var z:Int = 1){
return x+y+z
}
someOperations(1,2) //4を返す
someOpeartions(y = 1, x = 1) //3を返す6. 参照等価性
Kotlinには参照等価性('===')もあります。これは2つの変数が現在同じオブジェクトを参照しているかどうかをチェックします。
var a = 10
var b = 10
a == b //true
a === b //これもtrue。プリミティブ型のオブジェクト比較は値のみをチェックする
data class Person (val name: String)
val p1 = Person("John")
val p2 = Person("John")
p1 == p2 //true
p1 === p2 //false7. スマートキャスト
instanceofを使う代わりに、Kotlinはキャストや型チェックのためのよりシンプルで読みやすい構文を提供しています。
//型チェック
//Kotlinのスマートキャスト機構により、型チェックを通過すると
//自動的に対応する型へキャストされる
if (shape is Circle) {
println("it's a Circle")
shape.radius //自動的にCircleとして扱われる
} else if (shapeObject is Square) {
println("it's a Square")
} else if (shapeObject is Rectangle) {
print("it's a Rectangle")
}Kotlinには明示的なキャストを可能にするasキーワードもあります。
//静的キャストと同様に動作するため、安全とは見なされない
var anotherShape = shape as Circle
//安全なキャストにはこちらを使用できる
var safeShape = shape as? Circle8. コルーチン
Javaでは非同期処理は常に面倒なものでした。Threadを作成するとコード量が膨らみ、可読性が低下します。コルーチンは従来のスレッド操作に取って代わり、クリーンで堅牢なコードを実現します。
import kotlinx.coroutines.*
fun main() {
// バックグラウンドで新しいコルーチンを起動して続行
GlobalScope.launch {
// 1秒間のノンブロッキング遅延(デフォルトの時間単位はms)
delay(1000L)
// 遅延後に表示
println("World!")
}
// コルーチンが遅延している間もメインスレッドは続行
println("Hello,")
// JVMを存続させるためメインスレッドを2秒間ブロック
Thread.sleep(2000L)
}コルーチンは、Job Joining、Channel、Shared Context、Parentsなど、より複雑な操作もサポートしています。詳細やその他の使い方は公式ドキュメントをご覧ください。
まとめ
まとめると、Kotlinを使い始めるのは非常に簡単で、Javaとほぼ同じ感覚でKotlinのコードを書くことができます。さらに、KotlinにはJavaを使うよりも優位に立てる多くの機能が備わっています。
もちろん、Javaは現在も健在です。しかし、新しいことを学び始めることに間違いはありません。私たちプログラマーは生涯学習を受け入れ、学び続けることをやめてはいけません。Kotlinの最も素晴らしい点は、Javaからの移行がいかに簡単かということです。
お読みいただきありがとうございました。楽しんでいただけたなら幸いです。Kotlinの探求がうまくいきますように。それでは次回お会いしましょう。
-
Kotlinで実装するAndroidアニメーションのアクセシビリティ対応ガイド
初めてのAndroidコントリビューション向けにサンプルコードを調査していたところ、Kotlinで書かれたアニメーションの事例はほとんど存在せず、ネイティブなアニメーションにおけるアクセシビリティへの配慮を示すコード例も同様に少ないことが分かりました。そこで本記事では、Kotlinでネイティブな「展開(expand)」アニメーションを作成する方法と、TalkBackや拡大文字を利用しているユーザーを支援するための工夫について解説します。すべてのコードはサンプルリポジトリで公開しており、アニメーションするビューを含む単一のアクティビティで構成されています。元となるコードはCalum Turner
-
Androidスマホを脅威から守る8つのセキュリティ対策
AndroidはオープンソースのOSであるため脆弱性が指摘されることが多い一方で、今なお世界中で最も愛用されているOSの一つであることに変わりありません。GoogleはAndroid 7以降、セキュリティ対策の強化に力を入れてきました。しかし旧バージョンにはこうしたセキュリティ機能が備わっておらず、些細な侵入被害でも端末全体に影響が及ぶ恐れがあります。特にAndroid 5以前のバージョンで動作している端末は、感染リスクを軽減するために適切なセキュリティ対策を講じることが不可欠です。こうした対策は、ユーザー自身が日頃から継続的に実施する必要があります。それでは、増え続ける脅威からAndroid