2012-02-09 6 views
1

この記事はhttp://www.javapractices.com/topic/TopicAction.do?Id=31です。これはinstanceofを使って自分のオブジェクトがあらかじめ確認していることを確認するのが悪いことです。Java:instanceofを使用して異なるオブジェクトメソッドを公開する

しかし、私はこの場合、どうやってそれを行うのか分かりません。アイテムリストを返すAPIがあります。アイテムのリストは、すぐにそれがAPIの私があるので、それは管理者

for(Item item : items){      
       if (item instanceof User){ 
        ((User)item).getName()); 
        ((User)item).getEmail()); 
       } 
       else if (item instanceof Admin){ 
        ((Admin)item).getName()); 
        ((Admin)item).getEmailList().getPrimary()); 
       }       
      } 

に当たるとして、私は(ユーザー)のアイテムなどのアイテムをキャストした場合、私はClassCastExceptionがあるでしょう

ユーザーと管理者の両方を返します。アイテムを変更できません。アイテムには子プロセスのメソッドがありません。電子メールの取得方法は異なります。別の選択肢がありますか?

答えて

5

すべての一般的なメソッドを持つインターフェイスを定義し、UserクラスとAdminクラスを実装するようにして、これらの場合にオブジェクトにアクセスするためにそのインターフェイスのみを使用します。

EDIT(あなたはAPIを変更することはできませんので)

代替オプションは次のとおりです。あなたの現在のソリューションへ

  1. スティック。これは最高の貿易のようです。

  2. インターフェイスを定義し、このインターフェイスを実装して元のオブジェクトをラップする2つのラッパークラスを作成します。 OOPの観点からすれば、これはよりクリーンですが、これはあなたのケースでは少し大きめだと思いますが、それは本当に依存しています。

    理論
  3. :あなたはまた、リフレクションを使用することができますが、これをしない - それは、コードをさらに悪化させるだろう - 特にだけでなく、二つの異なるコンパイル時知らアイテムのサブタイプ

  4. がある場合(!)
+0

そのAPI、私は[OK]を、その後の選択肢がある – javaNoober

+0

いずれかのユーザーまたは管理者を変更することはできません。オプション1:あなたの現在のソリューションに固執します。これは最高の貿易のようです。オプション2:インターフェイスを定義し、このインターフェイスを実装して元のオブジェクトをラップする2つのラッパークラスを作成します。OOPの観点からすれば、これはもっときれいですが、これは少し大きめだと思います。 3.理論的な(!)オプション:リフレクションを使用することもできますが、しないでください - コードをさらに悪化させるでしょう - 特に2つの異なるItemサブタイプがある場合は特にありません – MRalwasser

+0

true、ラップすると良いアイデアです – javaNoober

-1

まず、コードは効果がありません。あなたは割り当てなしでgetterを呼び出すので、実際にgetterの戻り値は使用しません。

第2に、さまざまなタイプの要素を持つコレクションを持つことは悪い習慣です。あなたのccaseユーザと管理者。

第3に、こうしたコレクションが必要な場合でも、他のパターンを使用して必要なものを実行できます。たとえば、訪問者のパターンは、キャストの良い選択肢のように見えます。

+1

最初に:あなたは副作用がないことを知ることができません。さらに、これは短い例であり、おそらく完全なコードではありません。 Second:それらはItem型です。これらの要素が同じコレクション内にあることは完全に適切です。 –

+0

副作用のあるゲッターを書くのは犯罪です。 – AlexR

+0

私はあなたに完全に同意しますが、それは起こらないということを意味するものではありません。 : - \。 –

2

インターフェイスをItemに変更すると、コードでUserまたはAdminを扱っていても関係ないメソッドが公開されるので、ItemはgetName()メソッドとgetEmail()メソッドの両方を定義します。 )、UserとAdminはこれらのメソッドを適切に実装します。

ただし、使用しているAPIを制御していないため、今のところコードを書くことはほとんどありません。

ので、参照記事によって作られたポイントは、良いものですが、それはあなたが作業しているクラスを変更することができることを前提としています。

+1

合意しました。これらのクラスの** **は変更できません。 –

関連する問題