Javaでも使えるKotlin OSSを目指すためのkotlin.jvmの利用とインターフェース設計/Use of kotlin.jvm and interface design for Kotlin OSS that can also be used in Java
by
mako_makok
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1 ©2022 Loglass Inc. Javaでも使えるKotlin OSSを 目指すためのkotlin.jvmの利 用とインターフェース設計 Kotlin Fest Reject Conference 2022 2022.12.12 小林 允
Slide 2
Slide 2 text
2 ©2022 Loglass Inc. 小林 允(Makoto Kobayashi) @mako_makok 自己紹介 ● 所属: 株式会社ログラス ● 好きなもの ○ Kotlin, Java, Spring Boot, 日本酒 ○ Java4年、Kotlin 1年くらい ○ 日本酒は6年くらい
Slide 3
Slide 3 text
3 ©2022 Loglass Inc. アジェンダ ● ログラスでの課題 ● Sheetlinについて ● JavaからのSheetlinの利用 ● kotlin.jvmの利用
Slide 4
Slide 4 text
4 ©2022 Loglass Inc. 小林 允(Makoto Kobayashi) 自己紹介 企業価値を向上する 経営管理クラウド
Slide 5
Slide 5 text
5 ©2022 Loglass Inc. ログラスでの課題 ● 経営企画と呼ばれる方たちや事業部長をターゲットとしたプロダクト ● 表計算ソフトを利用して予実管理業務を行っている ● 表計算ソフトで作った予算をそのままアップロード・連携できる ● 逆に表計算ソフトの形式で DLができる ● 表計算ソフトはExcelとスプレッドシート両対応している ● Apache POIとgoogle-api-services-sheetsを利用している
Slide 6
Slide 6 text
6 ©2022 Loglass Inc. ログラスでの課題 問題1: 手続きなAPIでセルを定義していく必要がある ● 以下はPOIのコードだが、スプレッドシートのクライアントも似たような感じ
Slide 7
Slide 7 text
7 ©2022 Loglass Inc. ログラスでの課題 ● Excelにはあってスプレッドシートにない機能があったりする ● 類似機能はあるが、全然プロパティ名が違うことがある ○ 公式ドキュメントを読み込まなければならないので大変 問題2: Excel・スプレッドシート毎に全然違うコードを書くので倍の工数がかかる 機能差分で見た目が微妙に変わる
Slide 8
Slide 8 text
8 ©2022 Loglass Inc. Sheetlinについて ● これらの課題を解決するために Sheetlinというライブラリを開発している ● POIやスプレッドシートのクライアントに一定ペインを感じているユーザーはいる認識 ● 実際自分もキャリアの中で利用したことがあった ● そういったペインを解消できるライブラリ ● OSSとして公開することを目標に開発を行っている ○ Kotlinで開発 ○ 言語のシェアは圧倒的に Javaが多い ○ Kotlinはもちろんのこと、Javaで利用しやすいインターフェースを目指している ● 現在Loglassのプロダクトに本番投入して検証している
Slide 9
Slide 9 text
9 ©2022 Loglass Inc. Sheetlinについて ● Sheet, Row, Cellなどのような抽象化してい る ● ExcelファイルのByteArrayへの変換、 sheets APIを叩くwrapperを提供 ● 宣言的に書くことができる
Slide 10
Slide 10 text
10 ©2022 Loglass Inc. JavaでのSheetlinの利用 ● これだけ見るとなんの変哲もないインターフェー ス ● しかしJavaから見ると結構辛いインターフェース になる
Slide 11
Slide 11 text
11 ©2022 Loglass Inc. JavaでのSheetlinの利用 ● ofのような一見Kotlinから見ると、クラスに static methodが生えているように見えるが違う ● Kotlin側でデフォルト引数を書いても適用されな い ● 引数をnamedで書けないのでインスタンス生成 のエクスペリエンスが悪い
Slide 12
Slide 12 text
12 ©2022 Loglass Inc. kotlin.jvmの利用 ● 生成されるバイトコードを変化させることができる ● アノテーションで記述していく ● 主にシグネチャを変更するようなアノテーションが多い ● Kotlinで書いたコードをJavaで利用する時に便利 kotlin.jvmとは
Slide 13
Slide 13 text
13 ©2022 Loglass Inc. kotlin.jvmの利用 ● ofの実装は companion object { fun of(...) = Cell(...) }となっている ● コンパイルすると、クラスに Companionというシングルトンのオブジェクトの中に ofがある ● Kotlinから利用するときは Companionを省略できる ● Cell.of() == Cell.Companion.of() ● CompanionはKotlinの都合なので、Javaから見るともちろんCompanionは省略できない ● JvmStaticを使う ofのような一見Kotlinから見るとstaticっぽいやつが実はstaticではない
Slide 14
Slide 14 text
14 ©2022 Loglass Inc. kotlin.jvmの利用 JvmStaticをつけるとStaticメソッドとして生成される ofのような一見Kotlinから見るとstaticっぽいやつが実はstaticではない
Slide 15
Slide 15 text
15 ©2022 Loglass Inc. kotlin.jvmの利用 ● 似た挙動をするものとして JvmFieldがある ● companion object内に定義したフィールドにアノテートすると static なフィールドとして解釈される ofのような一見Kotlinから見るとstaticっぽいやつが実はstaticではない
Slide 16
Slide 16 text
16 ©2022 Loglass Inc. kotlin.jvmの利用 ● Javaにはデフォルト引数が無いので特に何も機能しない ● JvmOverloadsを使う ● 引数に取らないプロパティは Kotlinのデフォルト引数に設定している値が設定される Kotlin側でデフォルト引数を書いても適用されない
Slide 17
Slide 17 text
17 ©2022 Loglass Inc. kotlin.jvmの利用 ● Kotlinだとnamedで書けるので気にならない が、Javaだと意味わからない 引数をnamedで書けないのでインスタンス生成のエクスペリエンスが悪い
Slide 18
Slide 18 text
18 ©2022 Loglass Inc. kotlin.jvmの利用 ● 素直にビルダーパターンで 記述するインターフェースに 引数をnamedで書けないのでインスタンス生成のエクスペリエンスが悪い
Slide 19
Slide 19 text
19 ©2022 Loglass Inc. kotlin.jvmの利用 kotlin.jvmのその他のアノテーション ● JvmRecord ○ クラスにつけるとrecordとして生成できる ● JvmName ○ クラスやメソッドにつけることができ、生成される名称を変更することができる ● JvmWildcard, JvmSuppressWirldcard ○ ワイルドカードの生成をコントロールできる
Slide 20
Slide 20 text
20 ©2022 Loglass Inc. さいごに ● kotlin.jvmのアノテーションを利用したり、インターフェス設計を行なうことで相互運用は問題なく行 える ● ライブラリをベースにお話しましたが、 Kotlinを途中で導入した場合にも使えるプラクティスです ● 設計パターンはOSSのokhttpをめちゃくちゃ参考にさせていただいています
Slide 21
Slide 21 text
21