対象読者
- 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」とバージョンを表記するようにしています。