Slide 1

Slide 1 text

Server-Side Kotlin で必要なJava の知識 2021 年5 月12 日 竹端 尚人

Slide 2

Slide 2 text

Server-Side Kotlin で必要なJava の知識 2021 年5 月12 日 竹端 尚人

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

概要 竹端 尚人 フリーランスエンジニア Twitter: @n_takehata 職種: バックエンドエンジニア 好きな言語:Kotlin Server-Side Kotlin 、Java 、etc… ( 少し前まで) スマートフォンゲーム開発 昨年12 月からフリーランスに

Slide 5

Slide 5 text

登壇、執筆など CEDEC2018 、2019 登壇 Software Design 2019 年2 〜4 月号で短期連 載 書籍「 Kotlin サーバーサイドプログラミング 実践開発」を2021 年4 月に発売

Slide 6

Slide 6 text

書籍の一節 またJava との相互互換という特徴があり、世の中にすでに多くあるJava の資産を活用するこ ともでき、モダンかつ資産も豊富にあると いう素晴らしい言語です。 しかし、その特徴ゆえ「Java がわかる人じゃないと難しいんじゃないか」と思われてしまうことも多い です。

Slide 7

Slide 7 text

Kotlin を学ぶのにJava の知識はどれだけ必要なのか?

Slide 8

Slide 8 text

アジェンダ 1.Java の知識は絶対必要なのか? 2. よく使う知識 3. まとめ

Slide 9

Slide 9 text

アジェンダ 1.Java の知識は絶対必要なのか? 2. よく使う知識 3. まとめ

Slide 10

Slide 10 text

1.Java の知識は絶対必要なのか?

Slide 11

Slide 11 text

結論 Java 自体の知識はなくても学べる

Slide 12

Slide 12 text

書籍では「Java との相互互換」について書いた3 章以外は、Java のコードは出てきません

Slide 13

Slide 13 text

Java の知識があることを前提としなくても、Kotlin を学ぶことに問題はない Java 経験がない場合の学習コストは、他の言語に比べて特別高いということはない ただし、知っていると学ぶのが圧倒的に楽になる

Slide 14

Slide 14 text

知っていると有利な点 構文や機能で似たものを有している フレームワークやライブラリはJava 製のものを活用することも多い 世の中にある既存のJava の資産を活用できる

Slide 15

Slide 15 text

Java を知っていると楽だが、なくても大丈夫 (Kotlin やるためにJava を先に学ばなくては・・・ということはない)

Slide 16

Slide 16 text

アジェンダ 1.Java の知識は絶対必要なのか? 2. よく使う知識 3. まとめ

Slide 17

Slide 17 text

2. よく使う知識

Slide 18

Slide 18 text

オブジェクト思考の知識 フレームワーク、ライブラリの知識 Java の言語自体の知識

Slide 19

Slide 19 text

オブジェクト思考の知識 クラス、インターフェースなどの基本的なオブジェクト思考の知識はあった方が学びやすい C# など他のオブジェクト思考言語をやっていると理解はしやすい ( 似たような話で関数型の知識なども)

Slide 20

Slide 20 text

広義の意味で Java の知識

Slide 21

Slide 21 text

フレームワーク、ライブラリの知識 Spring Boot が無難な選択肢として上がる 各種ORM もJava 製が使われることが多い(Exposed がなかなか正式版にならないので) テスティングフレームワークはJUnit が多い

Slide 22

Slide 22 text

例えば Spring Boot を知っていた場合

Slide 23

Slide 23 text

以下のようなメリットがある Java と同じようなアーキテクチャのアプリケーションなので実装が理解しやすい フレームワークの機能を把握している 運用ノウハウがある

Slide 24

Slide 24 text

コード例

Slide 25

Slide 25 text

Spring Boot のアノテーション @RestController @RequestMapping("greeter") class GreeterController( private val greeter: Greeter ) { @GetMapping("/hello") fun hello(@RequestParam("name") name: String): HelloResponse { return HelloResponse("Hello ${name}") } }

Slide 26

Slide 26 text

Spring Security のインターフェース実装 class MyAuthenticationFailureHandler : AuthenticationFailureHandler { override fun onAuthenticationFailure( request: HttpServletRequest, response: HttpServletResponse, exception: AuthenticationException ) { response.status = HttpServletResponse.SC_UNAUTHORIZED } }

Slide 27

Slide 27 text

Java のライブラリを使う場合

Slide 28

Slide 28 text

Kotlin からJava のライブラリ呼び出し fun main() { val uuid = UUID.randomUUID() println(uuid.toString()) val now = LocalDateTime.now() println(now) }

Slide 29

Slide 29 text

いずれも Java の知識は使うが、 Java のコードは書かない

Slide 30

Slide 30 text

Java の言語自体の知識 フレームワークでJava のコードを生成する部分 Java との互換のための機能を使う時 既存のJava の資産を活用したい場合

Slide 31

Slide 31 text

フレームワークでJava のコードを生成する部分 gRPC 、各種ORM などで自動生成するコードでKotlin 対応してないもの 初めて扱う際などは読んでみた方が良い

Slide 32

Slide 32 text

gRPC の実装 @RestController class GreeterClientController { @GetMapping("/greeter/hello/{name}") fun hello(@PathVariable name: String): String = runBlocking { val channel = ManagedChannelBuilder.forAddress(HOST, PORT) .usePlaintext() .build() val request = HelloRequest.newBuilder().setName(name).build() val stub = GreeterGrpcKt.GreeterCoroutineStub(channel) val response = async { stub.hello(request) } response.await().text } }

Slide 33

Slide 33 text

生成されたコード public final class HelloRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:example.greeter.HelloRequest) HelloRequestOrBuilder { // ・・・ public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } // ・・・ public Builder setName( java.lang.String value) { if (value == null) { throw new NullPointerException(); // ・・・

Slide 34

Slide 34 text

自動生成なので書くことはないが、 必要に応じて読むことはある

Slide 35

Slide 35 text

Java との互換のための機能を使う時 @JvmStatic などの各種アノテーション SAM 変換 etc…

Slide 36

Slide 36 text

@JvmStatic class CompanyConstants { companion object { @JvmStatic val maxEmployeeCount = 100 } }

Slide 37

Slide 37 text

アノテーションがなかった場合 public static void main(String[] args) { System.out.println(CompanyConstants.Companion.getMaxEmployeeCount()); } Java からどう呼ばれるかの理解が必要

Slide 38

Slide 38 text

SAM 変換 fun main() { val function = CalcJava { num1, num2 -> num1 + num2 } println(function.calc(1, 3)) } @FunctionalInterface public interface CalcJava { Integer calc(Integer num1, Integer num2); } Java の何を呼んでいるかの理解が必要 ( 今はKotlin 同士でも使えるようになったのでJava 独自のものではないが)

Slide 39

Slide 39 text

Java からどう呼ばれているか、 Java をどう呼んでいるかを 理解する必要はある

Slide 40

Slide 40 text

既存のJava の資産を活用したい場合 Java にしかないOSS を使いたい場合 組織でJava の資産を持っていて活用したい場合

Slide 41

Slide 41 text

この場合は多分組織内に有識者がいるので問題ない

Slide 42

Slide 42 text

アジェンダ 1.Java の知識は絶対必要なのか? 2. よく使う知識 3. まとめ

Slide 43

Slide 43 text

3. まとめ

Slide 44

Slide 44 text

Java を知らなくてもServer-Side Kotlin は始められる ただし、Java を知っていると学習コストは圧倒的に下がる Java を書く必要はないが、多少読んだり理解する必要がある場面は存在する( でもそんなに怖がらなくてい いレベル)