如果我有以下对象:
Teacher extends Person
Student extends Person
然后,我在一个返回人员列表/数组等的服务中有一个函数,但列表中的某些项目可能是教师,有些可能是学生。
在返回端,我希望用户能够检查每个元素的实例,以确定它是学生还是教师。
构建此代码的最佳方法是什么。
所以,在服务中我想要这样的东西:
public LinkedList<Person> getPersonByID(List<String id>);
答案 0 :(得分:2)
最好的方法是使用多态来消除显式检查Person类型的需要。你究竟是如何做到的,取决于你的任务,也许你可以提供更多的代码。
答案 1 :(得分:2)
这可以使用visitor pattern 解决 instanceof
。 (如果使用普通的多态技术无法解决问题,那么从instanceof should be avoided开始,这种方法可能更受欢迎。)
以下是我的回答over here和demo on ideone.com:
的改编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);
}
}
答案 2 :(得分: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
// ...
答案 3 :(得分:0)
如果您知道以后需要更多灵活性,可以考虑从 is-a 转变为 has-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
}
}
答案 4 :(得分:-1)
您始终可以使用以下代码检查给定实例是否为给定类型的类型
if( selectedPerson instanceof Student)
...