GoogleはオープンソースのProtocol BuffersプロジェクトにKotlinのサポートを追加した。Kotlinの高度な構文機能を活用してプロト定義を慣用的なドメイン固有言語(DSL)に変換できるようになる。
KotlinのJavaとの相互運用機能のおかげで、Kotlinプログラムは、シンプルにProtocol BuffersコンパイラがJava言語用に生成できるクラスを使用するだけでProtocol Buffersと連携することができる。そのため、protoコンパイラでのKotlinに対する直接サポートには、これまで利用できなかった機能は取り入れられていない。それでも、Kotlinの高度な構文を活用して、慣用的なKotlinバインディングを生成する方法のおかげで、それは非常に興味深いものとなっている。その際、洗練されたDSLを構成する一連のファクトリメソッドを使用する。
KotlinのバージョンではKotlinタイプセーフビルダーが使用されています。そのため、簡潔になり、ビルドメソッドを明示的に呼び出す必要がなくなります。これがprotoコンパイラの標準モードと「proto lite」モードの両方で機能することを注記しておきます。後者では、よりAndroidに適した、より小さく、より高性能なクラスが生成されます。
DSLを使う利点は、糖衣コードをほとんど使用せずに生成されるコードにあるため、宣言的な見た目で、より表現力豊かになる。Googleは、それを明らかにするために、一連のサイコロの目を表すプロトコルバッファメッセージの簡単な例を示した。
/* Protobuf definition: */
message DiceSeries {
message DiceRoll {
int32 value = 1; // value of this roll, e.g. 2..12
string nickname = 2; // string nickname, e.g. "snake eyes"
}
repeated DiceRoll rolls = 1;
}
// Kotlin bindings usage:
val series = diceSeries {
rolls = listOf(
diceRoll { value = 5 },
diceRoll {
value = 20
nickname = "critical hit"
}
)
}
同じメッセージ定義のJavaバインディングでは、代わりに2つのクラスが作成される。これらのクラスは、上記のコードと同じ目的で、柔軟だが冗長なビルダーパターンを使って結合する必要がある。
その発表の中で、Googleは、どのようにしてKotlinプロトコルバッファをKotlin gRPCと簡単に統合できるかを示した。Kotlin gRPCは昨年オープンソース化されており、いくつかの基本的なクライアント/サーバーサンプルプロジェクトが提供されている。
Protocol Buffers用のKotlinバインディングは素晴らしい追加機能である。それでも比較的新しいものであり、潜在的な問題から免れていない。特に、プログラムで複雑なprotoモデルを使っている場合には、既知のKotlinコンパイラのバグに当たらないようにするか、プログラムに予約されているメモリを増やすことで対処できるようにする必要がある。
KotlinにGoogle独自のprotoバインディングを使う代替としてSquare's Wireを検討してもよいだろう。Squareが提供する、オープンソースの独立したProtocolBuffers実装である。これは、Java/Androidプラットフォームを特に対象としており、固有のKotlinバインディングと共にgRPCとの統合も提供する。