Java 21のSequenced Collectionsのreversedの実装について

この記事は GMOアドマーケティング Advent Calendar 2023 15日目の記事です。

GMOアドマーケティングのT.Nです。

最近弊社の一部のプロダクトのJavaを、Java 21にバージョンアップしました。
Java 21でリリースされたSequenced Collectionsのreversedが気になったので、
実装について調べてみました。

Sequenced Collectionsとは

まずはSequenced Collectionsについてです。
JEP 431(https://openjdk.org/jeps/431)で以下のインターフェースが新しく追加されました。

  • SequencedCollection
  • SequencedSet
  • SequencedMap

IntelliJのDiagramsでクラス図を生成し、以前のバージョンと比較しました。
左がJava 21で、右がJava 20です。
(各インターフェースの例を一つずつ記載していますが、実装されているクラスは他にもあります。)

ArrayList(SequencedCollection)

ListとCollectionの間にSequencedCollectionが入っています。

LinkedHashSet(SequencedSet)

LinkedHashSetとCollectionの間にSequencedSetとSequencedCollectionが入っています。
SequencedSetはSetもextendsしています。

LinkedHashMap(SequencedMap)

LinkedHashMapとMapの間にSequencedMapが入っています。

Sequenced Collectionsの使い方

追加されたインターフェースにより、以下のような処理を行えるようになりました。

ArrayListの場合

LinkedHashSetの場合

LinkedHashMapの場合

reversedの実装について

ここからが実装についてです。
今回はListのreversedの実装について調べました。

reversedはListインターフェースに定義されています。
デフォルト実装では、ReverseOrderListViewというクラスを返すようになっています。


上の処理で実行しているReverseOrderListViewのofメソッドは以下のようになっています。


ofの一つ目の引数が対象のListで、二つ目の引数が変更可能であるかを表す変数です。
ImmutableCollectionsなどでは二つ目の引数にfalseが渡されています。
modifiableがfalseの場合は変更しようとすると例外が発生します。

一つ目の引数のListの種類に応じて返すクラスを変えています。
既にReverseOrderListViewのインスタンスの場合はフィールドのListを返しています。
この場合はreverseのreverseなので、元のListをそのまま返しているようです。

それ以外の場合は、RandomAccessのListであるかを判定して返すクラスを変えています。
ReverseOrderListView.Randの方は、RandomAccessを実装しています。


Listを逆順にする処理は、DescendingIteratorというクラスで行われています。
ReverseOrderListViewのiteratorメソッドでDescendingIteratorを返しています。


DescendingIteratorは以下のようになっています。


元のListをListIteratorに変換してフィールドで保持しています。

hasNextでhasPrevious、nextでpreviousを実行することで、
逆順のイテレーションを実現しているようです。

ちなみに、ReverseOrderListViewのaddメソッドは、
Listの先頭に要素を追加するようになっています。
先頭に追加することで、逆になったListの最後に追加する動作を実現しています。


その他のListを操作するメソッドも、indexを反転させて処理しています。

まとめ

今回はSequenced Collectionについての簡単な説明と、
reversedの実装についての記事でした。

明日はK.Mさんによる「VSCodeでプロジェクトを開くとき、ついでにいろいろやる方法」です。

引き続き、GMOアドマーケティング Advent Calendar 2023 をお楽しみください!

■採用ページはこちら!
https://recruit.gmo-ap.jp/

■GMOアドパートナーズ 公式noteはこちら!
https://note.gmo-ap.jp/