0

だから、私はフルスクリーンのアプリケーションを作っていて、奇妙なことに出くわしました。

メソッド DisplayMode.equals(DisplayMode dm) はオーバーライドされていますが、正しく実装されているとは思いません。次のコードは、コンソールに false を出力します。

public static void main(String[] args){
    DisplayMode mode = new (1,2,16, DisplayMode.REFRESH_RATE_UNKNOWN);
    System.out.println(mode.equals(new DisplayMode(1, 2, 16, 60)));
}

表示モードがリフレッシュ レートの保存と同じで、そのうちの 1 つが不明な場合、それらは等しいはずです。そうでないのはなぜですか?誰かが私が使用する回避策を提案できますか? また、オンラインの Java ドキュメントで、2 つのオーバーロードされたバージョンの .equals() メソッドが表示されるのはなぜですか。1 つは DisplayMode オブジェクトを使用し、もう 1 つは Java.Lang.Object オブジェクトを使用します。https://docs.oracle.com/javase/7/docs/api/java/awt/DisplayMode.html

4

1 に答える 1

0

私が信じている違いは、最初のケースでは「リフレッシュレートが不明であることを知っている」と言っているのに対し、2番目のケースでは「リフレッシュレートが60であることを知っている」と言っているということです。 .

grepcodeからの実装は、次のことを示しています。

public boolean equals(DisplayMode dm) {
    if (dm == null) {
        return false;
    }
    return (getHeight() == dm.getHeight()
         && getWidth() == dm.getWidth()
         && getBitDepth() == dm.getBitDepth()
         && getRefreshRate() == dm.getRefreshRate());
}

下部のリフレッシュ レートの値を比較していることがわかります。

java.awt.DisplayMode#REFRESH_RATE_UNKNOWNは として定義されてい0ます。

2 番目の質問については、equalsメソッドをオーバーロードする理由についてです。これにより、コードが分離され、関心のある部分のみに集中できるようになります。たとえば、オーバーロードされていない場合、equalsメソッドは次のようになります

public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }

    if (obj instanceof DisplayMode) {
        DisplayMode dm = (DisplayMode) obj;

        return (getHeight() == dm.getHeight()
             && getWidth() == dm.getWidth()
             && getBitDepth() == dm.getBitDepth()
             && getRefreshRate() == dm.getRefreshRate());
    }

    return false;
}
于 2016-05-17T18:35:56.090 に答える