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