2

すべての.equals()メソッドが同じように作成されているわけではないようです。

私はAndroidアプリで下位互換性をテストしていて、何か奇妙なことに気づきました。Froyo(2.2)でアプリをテストしたとき、2つの同一のオブジェクトを比較するために使用すると、RectF.equals()が失敗します。Rect.equals()はすべてのバージョンで期待どおりに機能しますが、RectFはFroyoとJellyBeanの間でオーバーホールされたようです。ソースコードをステップスルーすると、RectFが.equalsを上書きすることはなく、Object実装を使用しただけのようです。ただし、Rect.equalsではそうではありません。

    Rect r1 = new Rect(0,0,1,1);
    Rect r2 = new Rect(r1);

    RectF rf1 = new RectF(0,0,1,1);
    RectF rf2 = new RectF(rf1);

    if (r1.equals(r2))
        Log.d(Build.VERSION.RELEASE,"r1 and r2 are equal");
    else
        Log.d(Build.VERSION.RELEASE,"r1 and r2 are NOT equal");

    if (rf1.equals(rf2))
        Log.d(Build.VERSION.RELEASE,"rf1 and rf2 are equal");
    else
        Log.d(Build.VERSION.RELEASE,"rf1 and rf2 are NOT equal");

上記のコードを見ると、両方の.equals()がtrueを返すことが期待されます。そうではありません。Rectの比較では常にtrueが返されますが、RectFの比較ではNexus 7ではtrueが返され、他のすべてのデバイスではfalseが返されます。ああ!

私はRectオブジェクトを広範囲に使用していて、問題が発生したことがないため、この問題を見つけるのにしばらく時間がかかりました。RectFがそれほど一貫性がないとは思っていませんでした。

私の質問は 、バージョン間のAndroidソースオブジェクトへの変更への参照を簡単に見つけるにはどうすればよいですか? APIリファレンスでは、新しいメソッドと非推奨について言及していますが、メソッドの動作が劇的に変更された場合については言及していません。code.google.comのバグリストもスキャンしましたが、何も見つかりませんでした。 不整合が疑われる場合に使用できる別のオンラインリソースはありますか? 自分のバグや矛盾に対処するのに十分な苦労をしているときに、問題が発生するたびにAndroidソースをたどる必要はありません。 たとえば、RectFの変更履歴全体を見つける簡単な方法はありますか?

ありがとう、

4

1 に答える 1

3

RectFクラスのメソッドにタイプミスがありましたequals()。バグは次のとおりです。

public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    // RectF r = (Rect) o; <=== bug!
    RectF r = (RectF) o;
    return left == r.left && top == r.top && right == r.right && bottom == r.bottom;
}

RectFのGitHubソースにアクセスして[履歴]をクリックすると、2012年3月9日に「RectF.equalsのタイプミスを修正する」というタイトルのエントリが見つかります。それをクリックすると、変化を見ることができます。

この修正が最初に含まれているAndroidのリリースを正確に追跡する必要はありませんでした。しかし、それはかなり最近のことなので、しばらくの間、ほとんどのデバイスにバグがあることを期待する必要があります。

于 2012-11-22T18:00:06.983 に答える