メモ: JDK1.1とJDK1.2のArrayクラスの違い

1つ前の記事の一部に、某方面から指摘を頂いたので、訂正しておきます。

シリアルバージョンUIDの計算中に、対象クラスのインタフェースを取得して、名前やシグネチャを利用します。その処理が、Arrayクラスの場合に、スキップされている点についてです。

3.インタフェース名

対象のクラスが配列クラスでない場合のみ、ここでの処理を行います。これは、昔(1.2)、インタフェースを取得するメソッドの挙動が違ったらしく、そのための処置みたい・・・でもタブン枝葉なので気にしなくてOK。

デフォルトのシリアルバージョンUIDを作成するコードを読んでみる - 虎塚

インタフェースを取得するメソッド(Class#getInterfaces)の挙動が、JDK1.2から変わったというよりも、Arrayクラスが実装するインタフェースがJDK1.1とJDK1.2で異なることが本質でした。Arrayクラスは、JDK1.2から、CloneableとSerializableを実装しています。

いわれて探してみたら、FAQ的な文書にも記述がありました。「API Incompatibilities in Version 1.2」の10番目です。

In the 1.2 platform, the getInterfaces method of class java.lang.Class will return an array containing Cloneable and Serializable class objects when invoked on a class representing an array. In the 1.1 platform, getInterfaces returned an empty array when invoked on the class representing an array.

Oracle Java Archive | Oracle Technology Network | Oracle

シリアルバージョンUIDは、そのクラスの指紋です。バージョンの異なるJavaを使うことで、クラスの同一性を担保する機構が損なわれるのは、避けるべき事態です。

そのために、Arrayクラスの場合だけ、インタフェースを指紋に含める手続きがスキップされるのでしょう。

# JDK1.1互換のJavaを書けるプログラマには常識なのかもしれませんが、もちろん自分は知りませんでした。ありがとうございます。