我有一个包含2个不同对象类型列表的类。
List<Student> students;
List<Lecturer> lecturers;
这些类中的每一个都有一个返回String的方法。我想从该字符串中找到一些东西,我要创建的方法对于两个列表,类名(学生/讲师),列表名称(学生/讲师)和方法相同名称(studentMethod / lecturerMethod)是唯一不同的名称。
知道className,listName和methodName,我如何获得正确的列表(称为listName),以便我可以从列表中的每个对象调用所需的方法(称为methodName)。
P.S。 :我知道为每个列表创建两个单独的方法会更容易,但我希望我的代码是干的,并且还要了解有关OOP原则的更多信息。
实施例: 如果我想获得学生名单,然后为每个学生调用studentMethod,我应该有这样的事情:
void dryMethod(String className, String listName, String methodName) {
Class<?> desiredClass = Class.forName(className);
List<desiredClass> desiredList = getListByName(listName);
Method desiredMethod = getMethodByName(methodName);
for(desiredClass object : desiredList){
manipulateString(object.desiredMethod());
}
}
dryMethod("Student","students","studentMethod");
有可能吗?
答案 0 :(得分:1)
创建父抽象类/接口,定义两个类应定义的方法。例如:
public interface Person {
public void desiredMethod();
}
// Student will have to give an implementation for desiredMethod()
public class Student implements Person
// Lecturer will have to give an implementation for desiredMethod()
public class Lecturer implements Person
然后make dryMethod使用实现Person
的类型列表:
void dryMethod(List<? implements Person> myList) {
// you can use List<Student> and List<Lecturer> as myList
for (Person person : myList) {
person.desiredMethod();
}
}
我建议您阅读有关Polymorphism的一些信息。
编辑:声明列表时,您可以执行以下操作:
List<Student> students; // only Student class allowed
List<Lecturer> lecturers; // only Lecturer class allowed
List<Person> students; // both Student and Lecturer class allowed
答案 1 :(得分:0)
有一件事要问自己,如果你有两个类,两个方法几乎完全相同,那么这两个方法实际上是否具有相同的名称并由同一个接口指定?
即使情况并非如此,您也不必放弃DRY。您可以在常用方法中定义字符串处理逻辑,并使用流运算符map
将students
和lecturers
转换为String
的流:
students.stream().map(Student::studentMethod).forEach(this::commonMethod);
lecturers.stream().map(Lecturer::lecturerMethod).forEach(this::commonMethod);
void commonMethod(String str) { ... }
虽然这比OOP风格更具FP风格。在不同类型上执行泛型操作的一个好的OOP方法是使用Visitor design pattern,但与流相比,这需要编写相当多的样板代码。