2011-01-24 10 views
2

私のようなオブジェクトがある場合:メソッドが返すインスタンスを見つける方法Javaのプログラミング

その後
Teacher extends Person 
Student extends Person 

を、私は人のリストなど/配列を返すサービスで機能を持っていますが、リスト上のいくつかの項目は、教師になることがありいくつかは学生かもしれません。

返品期限には、各要素のインスタンスを確認して、それが学生か教師かを判断できるようにしたいと考えています。

このコードを構成する最適な方法は何ですか。

public LinkedList<Person> getPersonByID(List<String id>); 

答えて

0

オブジェクトの種類を確認するために、実行時に使用することができますJavaでinstanceofキーワードがあります:

ので、サービスに私はこのような何かをしたいと思います。したがって、以下のようになるコード:

LinkedList<Person> foo = getPersonByID(some_id_list); 
for (Person p: foo) 
    if (p instanceof Teacher) 
     // do stuff 
    else if (p instanceof Student) 
     // again 
    else 
     // ... 
+1

のinstanceofの使用を演算子は通常、多型の不正使用を示します。 Headmaster、Parent、School Inspector、Kitchen Staff、Caretaker、Secretary、Teaching AssistantのようなPersonの新しい役割を導入すると、instanceof演算子はすぐに非常にスケーラブルになり、この複数のif/elseの検査のインスタンスは非常に高価です。 –

2

最良の方法は、多型を使用してPersonのタイプを明示的にチェックする必要性を排除することです。どのように正確にこれを行うには、あなたの仕事に依存し、多分もっと多くのコードを提供することができます。

+0

うん、私はまた、正しいパターンは、あなたがその情報を使って何をやろうとしているかに非常に依存していると思う。他のコメントで指示されているようにinstanceofをつけておくと良いかもしれませんが、すぐにリファクタリングが必要であることがわかり、より柔軟なものをしたいと思います。 –

-1

指定されたインスタンスは、これはvisitor patternを使用せずにinstanceofを解決できる

 if(selectedPerson instanceof Student) 
     ... 
2

次のコードで指定された型のタイプがある場合は、いつでも確認することができます。 (問題は、通常の多型の技法を用いて解くことができない場合には、このアプローチは、おそらくinstanceof should be avoidedので、好ましい。)ここで

demo on ideone.comで、私の答えover hereの適応である:

import java.util.*; 

public class Test { 

    public static void main(String[] args) { 

     List<Person> somePersons = new LinkedList<Person>(); 

     somePersons.add(new Teacher()); 
     somePersons.add(new Student()); 
     somePersons.add(new Teacher()); 

     for (Person p : somePersons) 
      p.visit(new Visitor() { 
       @Override 
       public void accept(Student student) { 
        student.learn("stuff"); 
       } 

       @Override 
       public void accept(Teacher teacher) { 
        teacher.teach("some other stuff"); 
       } 
      }); 
    } 
} 


interface Visitor { 
    public void accept(Teacher a); 
    public void accept(Student b); 
} 

abstract class Person { 
    String name; 
    abstract void visit(Visitor v); 
} 

class Teacher extends Person { 

    public void teach(String toTeach) { 
     System.out.println("I'm teaching " + toTeach); 
    } 

    public void visit(Visitor sv) { 
     sv.accept(this); 
    } 
} 

class Student extends Person { 

    public void learn(String toLearn) { 
     System.out.println("I'm learning " + toLearn); 
    } 

    public void visit(Visitor sv) { 
     sv.accept(this); 
    } 
} 
+0

Downvoter:ケアを説明する? – aioobe

0

あなたがいることを知っている場合後で柔軟性が必要な場合は、is-aからhas-aの関係に移行することを検討してください。

は-たは、教師の役割や学生の役割のような人が持つことができるロールのセット、だろう。または両方、学生が講義を与えている場合..

簡単な例では、このアプローチを示したい:


public enum Role {TEACHER, STUDENT} 

public class Person { 

    Set<Role> roles = new HashSet<Role>(); 

    public Person() { 
     // a person does not have roles initially 
    } 

    public boolean addRole(Role aRole) { 
     return roles.add(aRole); 
    } 

    public boolean hasRole(Role aRole) { 
     return roles.contains(aRole); 
    } 

    // ... 
} 

public void someMethod(Person person) { 

    if (Person.hasRole(Role.TEACHER)) { 
     // do teacher stuff 
    } 

    if (Person.hasRole(Role.STUDENT)) { 
     // do student stuff 
     // Note: persons may be Teacher AND Student at the same time 
    } 

} 
関連する問題