Как найти, какой экземпляр возвращает метод?Java-программирование - PullRequest
2 голосов
/ 24 января 2011

Если у меня есть такие объекты, как:

Teacher extends Person
Student extends Person

Тогда у меня есть функция в службе, которая возвращает список / массив и т. Д. Persons, но некоторые элементы в списке могут быть учителями.и некоторые могут быть студентами.

В конце я хотел бы, чтобы пользователь имел возможность проверить экземпляр каждого элемента, чтобы определить, является ли он студентом или учителем.

Что такоелучший способ структурировать этот код.

Итак, в сервисе я хотел бы что-то вроде этого:

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

Ответы [ 5 ]

2 голосов
/ 24 января 2011

Это можно решить без instanceof, используя шаблон посетителя . (Если проблема не может быть решена с использованием обычных методов полиморфизма, этот подход, вероятно, предпочтительнее, поскольку instanceof следует избегать .)

Вот адаптация моего ответа здесь , с демонстрацией на 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 голосов
/ 24 января 2011

Лучший способ - использовать полиморфизм, чтобы исключить необходимость явной проверки типа персонажа.Как именно вы это сделаете, зависит от вашей задачи, может быть, вы могли бы предоставить больше кода.

0 голосов
/ 24 января 2011

Если вы знаете, что вам понадобится больше гибкости, вы можете перейти от отношения 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
    }

}
0 голосов
/ 24 января 2011

Вы всегда можете проверить, является ли данный экземпляр типом данного типа, с помощью следующего кода

        if( selectedPerson instanceof Student)
        ...
0 голосов
/ 24 января 2011

В 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
      // ...
...