0

speed と呼ばれる保護された (抽象的である場合もある) メソッドの概要を示す Vehicle と呼ばれるクラスがあるとします。そして、サブクラス Car はそのメソッドをオーバーライドして独自の実装を定義します。

ここで、Vehicle クラスで速度メソッドを使用する必要がなくなったとします (何らかの理由ですべての車両が静止しているとします)。

Vehicle からメソッド speed を削除した場合、メソッドを削除した開発者が、サブクラスが特定のアクションを実行するためにメソッドに依存している可能性があることを認識できるように、コンパイル エラーをスローしたいと考えています。

技術的に言えば、コンパイル エラーは必要ありませんが、そのようなリファクタリングが発生したときにハードルとして機能する何らかの通知が必要です。このような状況を処理するために使用できるプログラミング パターンはありますか?

更新: Java 1.4 を使用しています (申し訳ありません!)

4

4 に答える 4

2

@Override注釈は、明示的にこの目的のためのものです。

Java 1.5+ を使用していない場合は、いいえ。ただし、 AOP使用してこれらのメソッドをインストルメント化して例外をスローするか、リフレクションとクラスパス スキャンを使用してすべてのサブクラスを調べ、そのメソッドの存在を確認することができます。

于 2012-06-06T17:34:35.727 に答える
1

抽象的である場合、親クラスから削除できる実装はなく、リスクはそれを実装しない新しいサブクラスに帰着します。親で保護および定義されている場合、親の実装が削除された場合に既にコンパイラ エラーをスローする必要がある 2 つのケースがあります。

1) サブクラスは、独自の実装を定義せずにそのメソッドを呼び出します。メソッドが存在しません。

2) サブクラスはメソッドを定義しますが、super への呼び出しが含まれています。繰り返しますが、メソッドは存在しません。

于 2012-06-06T17:44:55.887 に答える
0

@Overrideサブクラスのメソッドにはアノテーションを使用します。基本クラスからメソッドを削除すると、Eclipsejavacなどのツールは、オーバーライドされなくなったメソッドに対して警告を発行します。

編集:@Override Java 1.5.0 より前では使用できませんが、というツールがありますxdoclet。J2EE および EJB 2.1 の時代には、これは注釈を「シミュレート」し、javadoc のようなマーカーに基づくコードで魔法のようなことを行うために使用されていました。それを見て、多分あなたはそれを使うことができます。

編集 2: Java 1.4.x では、{@inheritDoc}この種の検証に JavaDoc タグを使用することもできます。@Overrideメソッドに で注釈を付ける代わりに@inheritDoc、次のようにします。

public class MyAwesomeClass extends BaseClass
{
    /** {@inheritDoc} */
    protected void myAweSomeMethod()
    {
        //...
    }
}

myAweSomeMethodで署名を変更BaseClassまたは削除すると、JavaDoc ツールから次のような警告が表示されます。

/home/npe/java-tests/MyAwesomeClass.java:4: 警告 - @inheritDoc が使用されていますが、myAwesomeMethod はメソッドをオーバーライドまたは実装していません。

于 2012-06-06T17:36:13.777 に答える
0

ネストされたクラスで記述super.speed()し、このメソッドを親で空のままにすることができます。親でこのメソッドを削除すると、例外が発生します。ただし、欠点があります。オーバーライドされたすべてのメソッドから呼び出す必要があります。試してみてください、おそらくこれはあなたを助けるでしょう

于 2012-06-06T17:44:05.057 に答える