Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Javaでも使えるKotlin OSSを目指すためのkotlin.jvmの利用とインターフェー...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mako_makok
December 12, 2022
Technology
950
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Javaでも使えるKotlin OSSを目指すためのkotlin.jvmの利用とインターフェース設計/Use of kotlin.jvm and interface design for Kotlin OSS that can also be used in Java
mako_makok
December 12, 2022
More Decks by mako_makok
See All by mako_makok
Kotlinにおける型の世界と エラーハンドリング / Type World and Error Handling in Kotlin
makomakok
3
1.2k
Slack_API_Wrapper_BoltでBotを爆速開発.pdf
makomakok
0
360
退屈なことはバッチにやらせよう
makomakok
1
650
Firebase + BoltではじめるSlackアプリ開発
makomakok
0
15k
Other Decks in Technology
See All in Technology
そのPoC、何を検証したつもりでしたか? AIプロダクトの価値検証で陥った落とし穴
techtekt
PRO
0
150
protovalidate-es を導入してみた
bengo4com
0
140
ABEMA の Datadog × OTel 基盤、 中から見るか? 外から見るか?
tetsuya28
0
110
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
ogiwarat
0
150
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
590
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
1
170
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
170
Amazon Bedrock AgentCore ワークショップ JAWS UG TOHOKU / amazon-bedrock-agentcore-workshop-jawsug-tohoku-2026
gawa
8
360
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
400
MIERUNE JCT 発表資料「宇宙から伊能忠敬ごっこ」
syuchimu
0
190
Agentic Web
dynamis
1
160
Rancherの紹介&Update情報(RancherJP Online Meetup #09)
yoshiyuki_kono
0
120
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
GraphQLとの向き合い方2022年版
quramy
50
15k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
820
Speed Design
sergeychernyshev
33
1.8k
The Curious Case for Waylosing
cassininazir
1
380
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
840
AI: The stuff that nobody shows you
jnunemaker
PRO
8
690
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
400
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
1 ©2022 Loglass Inc. Javaでも使えるKotlin OSSを 目指すためのkotlin.jvmの利 用とインターフェース設計 Kotlin Fest
Reject Conference 2022 2022.12.12 小林 允
2 ©2022 Loglass Inc. 小林 允(Makoto Kobayashi) @mako_makok 自己紹介 •
所属: 株式会社ログラス • 好きなもの ◦ Kotlin, Java, Spring Boot, 日本酒 ◦ Java4年、Kotlin 1年くらい ◦ 日本酒は6年くらい
3 ©2022 Loglass Inc. アジェンダ • ログラスでの課題 • Sheetlinについて •
JavaからのSheetlinの利用 • kotlin.jvmの利用
4 ©2022 Loglass Inc. 小林 允(Makoto Kobayashi) 自己紹介 企業価値を向上する 経営管理クラウド
5 ©2022 Loglass Inc. ログラスでの課題 • 経営企画と呼ばれる方たちや事業部長をターゲットとしたプロダクト • 表計算ソフトを利用して予実管理業務を行っている •
表計算ソフトで作った予算をそのままアップロード・連携できる • 逆に表計算ソフトの形式で DLができる • 表計算ソフトはExcelとスプレッドシート両対応している • Apache POIとgoogle-api-services-sheetsを利用している
6 ©2022 Loglass Inc. ログラスでの課題 問題1: 手続きなAPIでセルを定義していく必要がある • 以下はPOIのコードだが、スプレッドシートのクライアントも似たような感じ
7 ©2022 Loglass Inc. ログラスでの課題 • Excelにはあってスプレッドシートにない機能があったりする • 類似機能はあるが、全然プロパティ名が違うことがある ◦
公式ドキュメントを読み込まなければならないので大変 問題2: Excel・スプレッドシート毎に全然違うコードを書くので倍の工数がかかる 機能差分で見た目が微妙に変わる
8 ©2022 Loglass Inc. Sheetlinについて • これらの課題を解決するために Sheetlinというライブラリを開発している • POIやスプレッドシートのクライアントに一定ペインを感じているユーザーはいる認識
• 実際自分もキャリアの中で利用したことがあった • そういったペインを解消できるライブラリ • OSSとして公開することを目標に開発を行っている ◦ Kotlinで開発 ◦ 言語のシェアは圧倒的に Javaが多い ◦ Kotlinはもちろんのこと、Javaで利用しやすいインターフェースを目指している • 現在Loglassのプロダクトに本番投入して検証している
9 ©2022 Loglass Inc. Sheetlinについて • Sheet, Row, Cellなどのような抽象化してい る
• ExcelファイルのByteArrayへの変換、 sheets APIを叩くwrapperを提供 • 宣言的に書くことができる
10 ©2022 Loglass Inc. JavaでのSheetlinの利用 • これだけ見るとなんの変哲もないインターフェー ス • しかしJavaから見ると結構辛いインターフェース
になる
11 ©2022 Loglass Inc. JavaでのSheetlinの利用 • ofのような一見Kotlinから見ると、クラスに static methodが生えているように見えるが違う •
Kotlin側でデフォルト引数を書いても適用されな い • 引数をnamedで書けないのでインスタンス生成 のエクスペリエンスが悪い
12 ©2022 Loglass Inc. kotlin.jvmの利用 • 生成されるバイトコードを変化させることができる • アノテーションで記述していく •
主にシグネチャを変更するようなアノテーションが多い • Kotlinで書いたコードをJavaで利用する時に便利 kotlin.jvmとは
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ではない
14 ©2022 Loglass Inc. kotlin.jvmの利用 JvmStaticをつけるとStaticメソッドとして生成される ofのような一見Kotlinから見るとstaticっぽいやつが実はstaticではない
15 ©2022 Loglass Inc. kotlin.jvmの利用 • 似た挙動をするものとして JvmFieldがある • companion
object内に定義したフィールドにアノテートすると static なフィールドとして解釈される ofのような一見Kotlinから見るとstaticっぽいやつが実はstaticではない
16 ©2022 Loglass Inc. kotlin.jvmの利用 • Javaにはデフォルト引数が無いので特に何も機能しない • JvmOverloadsを使う •
引数に取らないプロパティは Kotlinのデフォルト引数に設定している値が設定される Kotlin側でデフォルト引数を書いても適用されない
17 ©2022 Loglass Inc. kotlin.jvmの利用 • Kotlinだとnamedで書けるので気にならない が、Javaだと意味わからない 引数をnamedで書けないのでインスタンス生成のエクスペリエンスが悪い
18 ©2022 Loglass Inc. kotlin.jvmの利用 • 素直にビルダーパターンで 記述するインターフェースに 引数をnamedで書けないのでインスタンス生成のエクスペリエンスが悪い
19 ©2022 Loglass Inc. kotlin.jvmの利用 kotlin.jvmのその他のアノテーション • JvmRecord ◦ クラスにつけるとrecordとして生成できる
• JvmName ◦ クラスやメソッドにつけることができ、生成される名称を変更することができる • JvmWildcard, JvmSuppressWirldcard ◦ ワイルドカードの生成をコントロールできる
20 ©2022 Loglass Inc. さいごに • kotlin.jvmのアノテーションを利用したり、インターフェス設計を行なうことで相互運用は問題なく行 える • ライブラリをベースにお話しましたが、
Kotlinを途中で導入した場合にも使えるプラクティスです • 設計パターンはOSSのokhttpをめちゃくちゃ参考にさせていただいています
21