2

TimeUnit 列挙型のソース コード (以下に簡略化)を確認しました。

public enum TimeUnit {

    SECONDS {
        public long toMillis(long d) { return d * 1000L; }
    },
    MINUTES {
        public long toMillis(long d) { return d * 60000L; }
    };

    public long toMillis(long duration) {
        throw new AbstractMethodError();
    }

}

抽象メソッドを使用して実装することもできました。

public enum TimeUnit {

    SECONDS {...}, MINUTES {...};

    public abstract long toMillis(long duration);

}

彼らは最初の実装を選択したので、理由があるに違いないと思います。したがって、私の質問は次のとおりです。なぜですか?AbstractMethodError投げられることはありますか?はいの場合、どのような場合ですか?

4

2 に答える 2

1

例外は、enum 値の 1 つがメソッドのオーバーライドに失敗した場合、またはスーパークラス メソッドを呼び出した場合にのみスローできます。その特定のアプローチはお勧めしません。提案された代替案が達成されるように、コンパイラにこれらのエラーをキャッチさせる方がはるかに優れています。

ちなみに、toMillis実装はMINUTES確かに間違っているように見えます。これは、私が持っている Java 7 ソースの実装ではありません。どこで見つけたの?

PS私がチェックしたところ:のAndroid実装はTimeUnitを使用していませんAbstractMethodErrorが、抽象メソッドも使用していません。さまざまなテーブルを使用し、レベルですべての変換メソッドを実装しenumます。

于 2013-08-21T14:59:10.443 に答える