2

3つのクラスがあるとします。スーパークラスである 1 つのクラスと、それを継承する他の 2 つのクラス。スーパークラスのインスタンスがあり、2 つのサブクラスのどちらのインスタンスかを知りたい場合、このオブジェクトはのインスタンスです。

1) instanceOf または getClass() を使用して比較する、または 2) スーパークラスで抽象メソッドを宣言し、それをサブクラスに実装して、クラスを表す列挙型を取得する 2 つのメソッドのうち、どちらがベスト プラクティスと見なされますか。

4

5 に答える 5

1

この場合のベスト プラクティスは、ポリモフィズムです。スーパークラスに抽象メソッドを作成します。サブクラスは具体的な実装を提供する義務があります。instanceof や getClass は必要ありません。

于 2013-03-31T16:20:33.143 に答える
0

instanceOf を使用する必要があります。enum のアプローチでは、後でインスタンスをチェックすることを事前に知っておく必要があり、クラスはそのために準備する必要があります。だから私はinstanceOfを好むでしょう。

于 2013-03-31T15:37:35.063 に答える
0

簡単な答え:おそらく、回避するのが最善の方法でクラス オブジェクトまたはクラス名を使用しようとしている場合です。それを回避することで、おそらくコードがよりクリーンになり、理解しやすく、拡張しやすくなります。

詳細な回答:オブジェクト指向ソフトウェア コード、特に Java を記述する場合、(サブタイプ) ポリモーフィズムの原則が多用されます。あなたの質問の文脈でそれを非常に単純化するには:クラスAのインスタンスがあり、クラスAがBとCによって拡張されている場合、そのパブリックメソッドを使用して、Aを「一般的な」Aとしてのみ扱うように努めますメンバー; また、B と C で何か違うことをしたい場合は、A でこのアクションのメソッド doSomething() を書きます。これは、A.doSomething() (A のデフォルトの実装) をオーバーライドすることで、B と C で異なる方法で実装されます。

(@EvgeniyDorofeev の回答で示唆されているように、デフォルトのアクションがない場合は、デフォルトのメソッドを抽象化できますが、A は抽象クラスである必要があります。)

これにはいくつかの利点があります。

  • A のコードは、B と C に精通している必要はありません。
  • 後で他のクラスを追加する場合、たとえば、A を拡張する D や C を拡張する E など、既存のコードを変更する必要はありません。それらのクラスで doSomething() をオーバーライドするだけです。
  • getClass() の使用や、クラスの人工列挙型の作成について心配する必要はありません... :-)

しかし、オブジェクト指向アプローチに対するより一般的な批判の一部として、批判されることもあります (たとえば、OOP Oversoldの The Noun Shuffleを参照してください)。

PS: getClass() の使用を避けられない場合があります (たとえば、クラス名を含むログ メッセージを準備するため)。OPは、直面している正確な問題を特定していないため、判断が困難です。いずれにせよ、クラスの独自の列挙型を作成する道をたどらないでください。getClass() を使用します (本当に必要な場合は、そこからクラス名を取得することもできます)。また、 getClass() をまったく必要としないように、これらのことを処理してくれる使用可能なライブラリがあることに気付くかもしれません (これはロギングの場合で、先ほど挙げた例です)。

于 2013-04-01T08:31:54.390 に答える
0

ほとんどの場合、ポリモーフィズムがより良い答えです。どのサブクラスかを尋ねなければならない場合、新しいサブクラスが追加されたときに、その質問に新しい「if」部分を追加するのを忘れる危険があります。

于 2013-03-31T15:28:32.260 に答える
-2

通常、ベスト プラクティスは、ブール関数 instanceOf() を呼び出すことです。これは問題なく機能するはずです。

私自身は、あなたの 2 番目のソリューションの方がはるかに使いやすいと思いますが、最初のソリューションは優れたプログラミング手法であると考えられています。

于 2013-03-31T15:29:50.800 に答える