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
mako_makok
December 12, 2022
Technology
980
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
370
退屈なことはバッチにやらせよう
makomakok
1
660
Firebase + BoltではじめるSlackアプリ開発
makomakok
0
15k
Other Decks in Technology
See All in Technology
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
610
【試作】IoT x AIエージェント
happysamurai294
0
100
作り直せるコードは迅速に 作り直せないDBは慎重に - AI時代のプロダクトエンジニアが「判断の不可逆性」で開発速度を変える話
kinosuke01
0
210
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
340
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
moznion
0
110
[RSJ26] NarrativeFlow: Flow-Based Vision-Language-Action Model Using Robot Velocity Fields
keio_smilab
PRO
0
150
Beyond the Hype: Practical AI for Your Oracle Database with MCP
thatjeffsmith
1
230
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
520
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
210
DMMブックスのNext.js化を加速させるAI活用 / Migrating DMM Books to Next.js with AI
kentarom
1
330
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
290
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.1k
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.6k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Building Adaptive Systems
keathley
44
3.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
230
Prompt Engineering for Job Search
mfonobong
0
430
Crafting Experiences
bethany
1
280
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
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