如何编写一个方法来轻松创建不同类型的子类
How can I write a method to easily create different types of subclasses
对于一个项目,我必须创建代表不同类型用户的对象。所有类型都是subclasses继承自superclassUser。在示例中,我们有一名学生、一名教师和一名协调员。每个 class 都有某些方法的不同实现。
要知道我们正在处理哪种类型的用户,需要从数据库中提取一条记录,包括用户角色。根据角色,创建不同类型的用户 subclass。
目前我正在使用如下所示的 switch 语句。然而,由于它们都有相同的构造函数,这会导致非常重复的代码。这怎么能做得更多elegant/efficiently?
public void makeUserTypes() {
switch (idRole) {
case 0:
user = new Student(idUser, username, firstName, lastName);
break;
case 1:
user = new Teacher(idUser, username, firstName, lastName);
break;
case 2:
user = new Coordinator(idUser, username, firstName, lastName);
break;
}
}
功能界面如何,带有开关或地图?
public interface UserCtor<U> {
U create(String idUser, String username, String firstName, String lastName);
}
然后你可以这样做:
public void makeUserTypes() {
UserCtor<?> ctor = null;
switch (idRole) {
case 0:
ctor = Student::new;
break;
case 1:
ctor = Teacher::new;
break;
case 2:
ctor = Coordinator::new;
break;
}
user = ctor.create(idUser, username, firstName, lastName);
}
或者您可以使用地图:
private static Map<Integer, UserCtor<?>> ctorMap = Map.of(
0, Student::new,
1, Teacher::new,
2, Coordinator::new
);
public void makeUserTypes() {
user = ctorMap.get(idRole).create(idUser, username, firstName, lastName);
}
或者数组(我不推荐,因为它假定 idRole
从 0 开始并且不会跳过数字)
private static UserCtor<?>[] ctors = {Student::new, Teacher::new, Coordinator::new};
public void makeUserTypes() {
user = ctors[idRole].create(idUser, username, firstName, lastName);
}
对于一个项目,我必须创建代表不同类型用户的对象。所有类型都是subclasses继承自superclassUser。在示例中,我们有一名学生、一名教师和一名协调员。每个 class 都有某些方法的不同实现。 要知道我们正在处理哪种类型的用户,需要从数据库中提取一条记录,包括用户角色。根据角色,创建不同类型的用户 subclass。 目前我正在使用如下所示的 switch 语句。然而,由于它们都有相同的构造函数,这会导致非常重复的代码。这怎么能做得更多elegant/efficiently?
public void makeUserTypes() {
switch (idRole) {
case 0:
user = new Student(idUser, username, firstName, lastName);
break;
case 1:
user = new Teacher(idUser, username, firstName, lastName);
break;
case 2:
user = new Coordinator(idUser, username, firstName, lastName);
break;
}
}
功能界面如何,带有开关或地图?
public interface UserCtor<U> {
U create(String idUser, String username, String firstName, String lastName);
}
然后你可以这样做:
public void makeUserTypes() {
UserCtor<?> ctor = null;
switch (idRole) {
case 0:
ctor = Student::new;
break;
case 1:
ctor = Teacher::new;
break;
case 2:
ctor = Coordinator::new;
break;
}
user = ctor.create(idUser, username, firstName, lastName);
}
或者您可以使用地图:
private static Map<Integer, UserCtor<?>> ctorMap = Map.of(
0, Student::new,
1, Teacher::new,
2, Coordinator::new
);
public void makeUserTypes() {
user = ctorMap.get(idRole).create(idUser, username, firstName, lastName);
}
或者数组(我不推荐,因为它假定 idRole
从 0 开始并且不会跳过数字)
private static UserCtor<?>[] ctors = {Student::new, Teacher::new, Coordinator::new};
public void makeUserTypes() {
user = ctors[idRole].create(idUser, username, firstName, lastName);
}