3つのクラスがあるとします。スーパークラスである 1 つのクラスと、それを継承する他の 2 つのクラス。スーパークラスのインスタンスがあり、2 つのサブクラスのどちらのインスタンスかを知りたい場合、このオブジェクトはのインスタンスです。
1) instanceOf または getClass() を使用して比較する、または 2) スーパークラスで抽象メソッドを宣言し、それをサブクラスに実装して、クラスを表す列挙型を取得する 2 つのメソッドのうち、どちらがベスト プラクティスと見なされますか。
3つのクラスがあるとします。スーパークラスである 1 つのクラスと、それを継承する他の 2 つのクラス。スーパークラスのインスタンスがあり、2 つのサブクラスのどちらのインスタンスかを知りたい場合、このオブジェクトはのインスタンスです。
1) instanceOf または getClass() を使用して比較する、または 2) スーパークラスで抽象メソッドを宣言し、それをサブクラスに実装して、クラスを表す列挙型を取得する 2 つのメソッドのうち、どちらがベスト プラクティスと見なされますか。
この場合のベスト プラクティスは、ポリモフィズムです。スーパークラスに抽象メソッドを作成します。サブクラスは具体的な実装を提供する義務があります。instanceof や getClass は必要ありません。
instanceOf を使用する必要があります。enum のアプローチでは、後でインスタンスをチェックすることを事前に知っておく必要があり、クラスはそのために準備する必要があります。だから私はinstanceOfを好むでしょう。
簡単な答え:おそらく、回避するのが最善の方法でクラス オブジェクトまたはクラス名を使用しようとしている場合です。それを回避することで、おそらくコードがよりクリーンになり、理解しやすく、拡張しやすくなります。
詳細な回答:オブジェクト指向ソフトウェア コード、特に Java を記述する場合、(サブタイプ) ポリモーフィズムの原則が多用されます。あなたの質問の文脈でそれを非常に単純化するには:クラスAのインスタンスがあり、クラスAがBとCによって拡張されている場合、そのパブリックメソッドを使用して、Aを「一般的な」Aとしてのみ扱うように努めますメンバー; また、B と C で何か違うことをしたい場合は、A でこのアクションのメソッド doSomething() を書きます。これは、A.doSomething() (A のデフォルトの実装) をオーバーライドすることで、B と C で異なる方法で実装されます。
(@EvgeniyDorofeev の回答で示唆されているように、デフォルトのアクションがない場合は、デフォルトのメソッドを抽象化できますが、A は抽象クラスである必要があります。)
これにはいくつかの利点があります。
しかし、オブジェクト指向アプローチに対するより一般的な批判の一部として、批判されることもあります (たとえば、OOP Oversoldの The Noun Shuffleを参照してください)。
PS: getClass() の使用を避けられない場合があります (たとえば、クラス名を含むログ メッセージを準備するため)。OPは、直面している正確な問題を特定していないため、判断が困難です。いずれにせよ、クラスの独自の列挙型を作成する道をたどらないでください。getClass() を使用します (本当に必要な場合は、そこからクラス名を取得することもできます)。また、 getClass() をまったく必要としないように、これらのことを処理してくれる使用可能なライブラリがあることに気付くかもしれません (これはロギングの場合で、先ほど挙げた例です)。
ほとんどの場合、ポリモーフィズムがより良い答えです。どのサブクラスかを尋ねなければならない場合、新しいサブクラスが追加されたときに、その質問に新しい「if」部分を追加するのを忘れる危険があります。
通常、ベスト プラクティスは、ブール関数 instanceOf() を呼び出すことです。これは問題なく機能するはずです。
私自身は、あなたの 2 番目のソリューションの方がはるかに使いやすいと思いますが、最初のソリューションは優れたプログラミング手法であると考えられています。