この連載はRxJavaを使って、リアクティブプログラミングにおけるポイントやRxJavaが持つ機能について学んでいくことを目的としています。前回は現在の安定板であるRxJava 1.xで実際に簡単なサンプルを実装してみましたが、今回は次期バージョンとなるRxJava 2.xを使って実装するためのポイントについて見ていきます。特に、2.xになって対応することになったReactive Streamsとは何か、バージョンが上がったことによって主にRxJavaの何が変わったのかについて見ていきます。
対象読者
- Java経験者(初心者可)
- RxJava未経験者
- リアクティブプログラミング未経験者
※ただし、前回までの連載を読んでいる前提です。
2.xへのバージョンアップについて
RxJavaのバージョンが1.xから2.xに上がった背景にReactive Streamsの適用があります。Reactive Streamsとはどのライブラリやフレームワークを使っているのかに関係なく、データストリームを非同期で扱えるようにするための共通の仕組みを提供するもので、そのためのインタフェースを提供しています。
ちなみにReactive Streamsが提供するのはインタフェースのみで、実装は各ライブラリやフレームワークに委ねられます。
RxJavaの今回のバージョンアップでは、このReactive Streamsの実装とともに、まったく新しく実装しなおすことでパフォーマンスの改善も図っています。基本的にはReactive Streams自体がRxJavaの影響を強く受けているので、根本的な仕組み(データストリームの扱いや生産者と消費者の関係など)には大きな違いはありませんが、後で説明するバックプレッシャーの仕様に基づき、それに関するAPIに対しての差異が入っています。そのため、1.xから2.xに移行する際に単にパッケージ名やクラス名を変えるだけではなく、それらのAPI周りの変更も必要になります。また、RxJava内部の作り自体はスクラッチから始めたと公式に述べられているように、今までとは別物と思った方がよいでしょう。
さらに、前のバージョンである1.xでは他のライブラリに対しての依存はありませんでしたが、今回はReactive Streamsを実装しているため、Reactive Streamsのjarが必須になります。
また、RxJava 1.xとRxJava 2.xではルートとなるパッケージが完全に異なっています。
| バージョン | パッケージ |
|---|---|
| 1.x | rx |
| 2.x | io.reactivex |
そのため、RxJavaの異なる2つのバージョンを同じプロジェクト内に混在させることは可能ですが、そのプロジェクトがRxJavaに依存しているライブラリーを使っている場合、そのライブラリーがどのように対応しているかによって混在するのが難しい場合もあります。また、異なるバージョンを混在させることが可能でありRxJava 1.xもしばらくは公式にサポートされるようになっていても、運用や保守を考えると、混在させるのはRxJava 2.xへの移行時など一時的な場合に限定したほうがよいでしょう。また異なるバージョンのクラスを同じソース上に混ぜ合わせたりするのも後で管理が大変になり、クラス名の衝突も発生したりするので避けた方がよいです。
また、「RxJava」の表記について今後の連載では、「RxJava」とだけ表記している場合は基本的にバージョン2.xについて述べていることにします。もしバージョンの違いについて明確にする場合は、例えばバージョン1.xについて述べる場合は「RxJava 1.x」とバージョンを表記するようにしています。
- 修正履歴
-
- 2016/10/31 18:23 「Reactive Streamsのルール」の項を更新。
- 2016/10/24 15:56 3ページ目の「Reactive Streamsのルール」の解説を加筆修正しました。
この記事は参考になりましたか?
- RxJavaによるリアクティブプログラミング入門連載記事一覧
- この記事の著者
-
須田 智之(スダ トモユキ)
十数年間おもにSI企業にシステムエンジニアとして携わり、現在はフリーランスに。企業向けのシステム開発のかたわら個人でのモバイルアプリの開発やIT分野の記事も執筆。RxJava 2.0に対応した著書『RxJavaリアクティブプログラミング』が2017年2月16日より発売中。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
