2016-08-24 4 views
1

私は2つのほぼ同じクラスを持っているとしますが、それは主要な違いを持つオブジェクトを表しています。現時点では、これらの違いは実際には実装されていません。Javaのインスタンスは機能的に同じクラスを区別できますか?

たとえば、あるクラス(MorningShiftWorker)は、同じメソッドと同じコンストラクタを別のもの(EveningShiftWorkerと呼びます)と呼びます。両方のオブジェクトは、スーパータイプShiftWorkerのリストに格納されます。

論理的には、これらの2つのグループを分けるのが理にかなっていますが、instanceofを使用してShiftWorkerリストのオブジェクトをチェックするだけです。

私の質問は:instanceofは、オレンジとリンゴを区別するのに十分なスマートなのでしょうか?これらの2つのクラスは、名前を除いてすべて同じです。 instanceofで十分に分かりますか?これについて別の方法がありますか? Javaはオブジェクト/クラスが

+0

あなたは単にそれを試してみませんか? – Manu

+0

これらは2つの別々のクラスファイルで定義されており、どちらも別のクラスファイルを継承しないため、別のクラスファイルのインスタンスではありません – user902383

+0

これは重大なモデリングの問題を抱えているようです。ドメインモデルが適切に構築されていれば、 'instanceof'を使う必要はほとんどありません。 – chrylis

答えて

3

はい、instanceofは、オブジェクトが指定されたクラスに正しくキャストできるかどうかを確認します。私たちは、これらのクラスがあるとします。

public class Fruit {} 
public class Orange extends Fruit {} 
public class Apple extends Fruit {} 

はその後、我々がしようと、いくつかの方法で:

Fruit f = new Apple(); 
boolean isOrange = f instanceof Orange; //False 

また、これは、空/非機能のインターフェイスのために動作します。

+0

私は、instanceofを使用するとコードデザインが貧弱だと聞いています。私が勉強しなければならない別のアプローチもありますか?また、ありがとう!私はちょうどそれをテストしなければならないが、それはストレスの多い週だったと私はまだボールにはまだ今日ではない! – TheFunk

+0

@ TheFunkは[訪問者パターン](http://www.tutorialspoint.com/design_pattern/visitor_pattern.htm)を見てください。しかし、あなたの例では、あなたができるベースクラスで異なって実装されたcalcPayあなたのリストからポリモーフィックに呼んでください。visitorやinstanceofの必要はありません – PSD

+0

@ TheFunk 'instanceof'は本質的に悪いデザインを意味しません。私が気づいているのは、プログラマが 'instanceof'を使う能力に基づいてロジックを設計しているということです。 OOPのパラダイム(オーバーロードなど)やデザインパターン(通訳、ファサードなど)があり、「どのような種類のオブジェクトがこの参照を指しているか」の問題をはるかに克服することができます。本質的に:それを使用することを恐れてはいないが、それを使用することを期待しないでください。 – Zircon

0

はイエスinstanceofは、十分な「スマート」です。 xがinstanceof yであるかどうかは、xyが名前以外の同一のクラスであっても非常によくわかります。

それは最初のパラメータが第二のパラメータの継承階層にあるかどうかだけをチェックし、すなわちすべてがinstanceof ObjectIntegerFloatであり、その友人はinstanceof Numberであり、タイプyのすべてのオブジェクトxのためのコースのx instanceof y

3

instanceofオペレータは、クラスの内容を比較しない構造ではない区別するための名前を使用しているため

+0

"' x instanceof x' "これは' x'には意味がありません。 'x'が値であれば' instanceof'の右にすることはできません。それがタイプの場合、それは左にあることはできません。 –

2

間違った質問をしています。あなたは "私の壊れたデザインを修正するにはどうすればいいですか"と尋ねるべきです。

「ほぼ同じ」クラスで、メソッドとコンストラクタ内で「複製」コードを共有する必要がある場合は、あなたは何かをしているが間違って

重複コード

したがって、instanceofを気にする代わりに、元に戻す必要がありますどのようにあなたは共通のの実装で終わることができる方法を見つけるためにクラス階層を再設計する必要があります。あなたの朝と夕方のシフターには「それらの異なる側面」しか含まれていません。

ロバート・マーティンの「アジャイルの原則」を参照してください。その本には、「支払いシステム」に関する素晴らしい実例が含まれています。非常に異なるモデルで支払われる従業員を全面的に複製することなく、システムをどのように作成するかを詳細に説明します。 (あなたはインターネットで無料でPDFとして "C#"バージョンを見つけることさえできます)。

+0

ありがとう。現時点では、クラスは機能的には同じですが、実際には共通のコードは含まれていません。下の@PSDと話すとき、私は多型を思い出しました。私のスーパークラスに抽象メソッドを持たせる場合、それらを私のサブクラスで定義することはできますが、これまでにinstanceofを使用しなくてもスーパークラスで呼び出すことができます! :D – TheFunk

+0

はい、それは物事がどうあるべきかです。 – GhostCat

関連する問題