2016-05-26 2 views
-1

ArrayList<Object> objectList = new ArrayList<Object>(); 私は、異なる種類のオブジェクト(オブジェクトAとオブジェクトBなど)を含むリストを生成するために、 )。私はまた、1が異なる種類のオブジェクトを順番に格納し、そのプロパティに従って使用すること

for (Object obj : objectList){ 
    if(obj.getClass() == A.class){ 
     doSomething(); 
    } 
} 

を使用して、そのリストに含まれているオブジェクトの種類を検索することができます状態の答えを見てきましたが、そのは、これは非常にエレガントなアプローチではないことを述べました。一方、抽象クラスやインタフェースを使用する場合、オブジェクトAとオブジェクトBに対して同じメソッドを用意する必要があります。例えば、A.get()が整数を返す場合、Bget()は整数。しかし、私が望むのは、私のobjectListを使用するメソッドは、objectListに含まれる異なるオブジェクトに対して異なる処理を行うということです。したがって、A.get()は整数を返し、Bget()は文字列を返します。

だから私はあなたに聞きたいことは、これを行うための最善の方法は何ですか?その "ハック"を書くのは難しくないが、私は良いコードを書いてみたいです。

ありがとうございました。

+0

あなたがinstanceof演算子と同じメソッド名 – Limetics

+0

使用を持っている場合、私は=、汎用オブジェクトを使用することができると思います> 'if(obj instanceof A)'の代わりに 'obj.getClass()== A.clこの回答を参照してください:http://stackoverflow.com/questions/7526817/use-of-instance-of-in-java – krokodilko

+0

なぜ私はこの投稿の-1評価を得るのですか?私は適切な文法を使用します。私は質問の中にコードの大きな部分をコピーするだけではなく、私の質問を理解しやすくしました(皆さんは私の質問をすぐに理解しました)。それで問題なの?どうも。ありがとうございました。 – TopCoder

答えて

1

doSomething()のメソッドがオブジェクトの種類に大きく依存している場合は、そのオブジェクトに移動してインターフェイスを使用できます。これは強力でどのようにエレガント

public interface Foo { 
    void doSomething(); 
} 

public class A implements Foo { 
    public void doSomething() { 
     // do something 
    } 
} 


for (Foo obj : objectList){ 
    obj.doSomething(); 
} 

doSomething()で行われているものに依存します。オブジェクトごとに実際に異なる場合は、この方法が有効です。それが似ている場合は、相違点のみを識別し、上記のようなインタフェースでカプセル化してみてください。

+0

問題は、他の誰かによって行われたコードの大きなセクションに書き込まなければならないことです。コードのそのような良いセクションではないので、私はそれを悪化させないように最善を尽くしています。 – TopCoder

0

このようにします。

public class BaseClass { 
    public void method() {} 
} 
public class ChildOne extends BaseClass { 

    public void method() { 
     System.out.println("inside ChildOne"); 
    } 
} 
public class ChildTwo extends BaseClass { 

    public void method() { 
     System.out.println("inside ChildTwo"); 
    } 
} 
public class Client { 

    public static void main(String[] args) { 
     List<BaseClass> obj = new LinkedList<>(); 
     obj.add(new ChildOne()); 
     obj.add(new ChildTwo()); 

     for (BaseClass b : obj) { 
      ((BaseClass) b).method(); 
     } 
    } 
} 
+1

'method'が' BaseClass'に実装されていない場合は、それを抽象クラスまたはインタフェースにします。 –

+0

実際、私は可能な限りシンプルにしようとしていましたが、はいインタフェースのアプローチは良いです – emotionlessbananas

+0

いいえ、これのようにはありません。私の場合、両方のクラスChildOneとChildTwoは異なる値を返します(あなたの例では両方ともvoidを返します)。 – TopCoder

関連する問題