既存アプリケーションで�Kotlinを導入してみた
JJUG CCC 2018 Fall 2018/12/15
フリュー株式会社 佐藤慧太(@SatohJohn)
#jjug_ccc #ccc_c5
スライドのURLです!
自己紹介
対象のアプリケーション
ピクトリンク
ピクトリンク
ピクトリンク
JJUG CCCとピクトリンク
JJUG CCCとピクトリンク
つまりJavaがメインの開発
目的
今回話すこと
今回話すこと
今回話さないこと
そもそもKotlinって何よ
そもそもKotlinって何よ
なぜServer Side Kotlin
なぜServer Side Kotlin
Kotlin使って良かった点
使って良かった点
使って良かった点
標準で利用できる便利な記法が多い
標準で利用できる便利な記法が多い
標準で利用できる便利な記法が多い
分割宣言
private StringData getStringData() {
var str = "string";
return new StringData(str, str.length());
}
private class StringData {
private String str;
private int length;
public StringData(String str, int length) {
this.str = str;
this.length = length;
}
}
public void test() {
StringData stringData = getStringData();
System.out.println(String.format("%s, %s", stringData.str, stringData.length));
}
Kotlin
Java
private StringData getStringData() {
var str = "string";
return new StringData(str, str.length());
}
private class StringData {
private String str;
private int length;
public StringData(String str, int length) {
this.str = str;
this.length = length;
}
}
public void test() {
StringData stringData = getStringData();
System.out.println(String.format("%s, %s", stringData.str, stringData.length));
}
Kotlin
Java
内部クラスを作成する必要がある
返り値のクラスのプロパティから取得する
fun getStringData(): Pair<String, Int> {
val str = "string"
return Pair(str, str.length)
}
fun main(args: Array<String>) {
val (str, length) = getStringData()
println("${str}, ${length}")
}
Kotlin
Java
fun getStringData(): Pair<String, Int> {
val str = "string"
return Pair(str, str.length)
}
fun main(args: Array<String>) {
val (str, length) = getStringData()
println("${str}, ${length}")
}
Kotlin
Java
受け取る際に展開されるのでそのまま利用できる
分割宣言 - 注意点
標準で利用できる便利な記法が多い
スコープ関数
public static void main(String[] args) {
var param = "parameter";
System.out.println(param);
TestObject result = create(param.toUpperCase());
}
private class TestObject {
private final String param;
public TestObject(String param) {
this.param = param;
}
}
private TestObject create(String param) {
return new TestObject(param);
}
Kotlin
Java
public static void main(String[] args) {
var param = "parameter";
System.out.println(param);
TestObject result = create(param.toUpperCase());
}
private class TestObject {
private final String param;
public TestObject(String param) {
this.param = param;
}
}
private TestObject create(String param) {
return new TestObject(param);
}
Kotlin
Java
一時変数をおいて処理を
実行していく必要がある
fun main(args: Array<String>) {
val result: TestObject = "parameter".also { param ->
println(param)
}.let { param ->
create(param.toUpperCase())
}
}
private class TestObject(val param: String)
private fun create(param: String) = TestObject(param)
Kotlin
Java
fun main(args: Array<String>) {
val result: TestObject = "parameter".also { param ->
println(param)
}.let { param ->
create(param.toUpperCase())
}
}
private class TestObject(val param: String)
private fun create(param: String) = TestObject(param)
Kotlin
Java
paramという形で短い
スコープで実装できる
fun main(args: Array<String>) {
val result: TestObject = "parameter"
.also { println(it) }
.let { create(it.toUpperCase()) }
}
private class TestObject(val param: String)
private fun create(param: String) = TestObject(param)
Kotlin
Java
引数を取らずにitとする�こともできる
スコープ関数 - 注意点
標準で利用できる便利な記法が多い
Data Class
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class User {
private String uid;
private String name;
private String mailAddress;
}
data class User(
var uid: String,
var name: String,
var mailAddress: String
)
Kotlin
Java
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
@AllArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
private String uid;
private String name;
private String mailAddress;
}
data class User(
val uid: String,
val name: String,
val mailAddress: String
)
Kotlin
Java
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
@AllArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
private String uid;
private String name;
private String mailAddress;
}
data class User(
val uid: String,
val name: String,
val mailAddress: String
)
Kotlin
Java
varは再代入可能なので
valにするだけ
Data Class - 注意点
標準で利用できる便利な記法が多い
拡張関数
class Account
fun Account?.isExist() = this != null
fun main(args: Array<String>) {
val account: Account? = if (args.isNotEmpty()) Account() else null
if (account.isExist()) {
print("存在するアカウントだよ")
} else {
print("存在しないアカウントだよ")
}
}
Kotlin
Java
拡張関数 - 注意点
標準で利用できる便利な記法が多い
Smart Cast(Contract)
interface Base {
fun isA() : Boolean
}
class A : Base {
override fun isA(): Boolean = true
fun doSomethingA() = println("A")
}
class NotA : Base {
override fun isA(): Boolean = false
fun doSomethingNotA() = println("NotA")
}
Kotlin
Java
@ExperimentalContracts
fun main(args: Array<String>) {
val create:Base = A()
if (create.test()) {
create.doSomethingA()
} else {
create.doSomethingNotA()
}
}
@ExperimentalContracts
fun Base.test(): Boolean {
contract {
returns(true) implies (this@test is A)
returns(false) implies (this@test is NotA)
}
return isA();
}
Kotlin
Java
@ExperimentalContracts
fun main(args: Array<String>) {
val create:Base = A()
if (create.test()) {
create.doSomethingA()
} else {
create.doSomethingNotA()
}
}
@ExperimentalContracts
fun Base.test(): Boolean {
contract {
returns(true) implies (this@test is A)
returns(false) implies (this@test is NotA)
}
return isA();
}
Kotlin
Java
test() がtrueを返すならinterface Baseはclass Aである
Smart Cast(Contract) - 注意点
使って良かった点
ツールによるサポートが手厚い
Demo - convert
使って良かった点
使える場所が多い
// 重要なとこだけ抜き出してます
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
compileKotlin {
kotlinOptions {
freeCompilerArgs = ["-Xjsr305=strict"]
jvmTarget = "1.8"
}
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
Kotlin
Groovy
// 重要なとこだけ抜き出してます
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm")
}
dependencies {
compile(kotlin("stdlib"))
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
jvmTarget = "1.8"
}
Kotlin
Groovy
使って良かった点
Javaと併用して使える
Demo - Spring Boot: searchByName
Kotlin興味でてきました?
休憩: Kansai.ktについて
ここまでで30分ぐらい
気をつけるべきパターン
気をつけるべきパターン
既存のJavaとの連携
Demo - Spring Boot: searchByUid
バージョンアップ
JDKとの折り合い
まとめ
まとめ
最後に、ちょっと採用について
特に Kotlin書いている�Android エンジニア
参考リンク
fin...