Java 如何编写一个方法来轻松创建不同类型的子类

Java 如何编写一个方法来轻松创建不同类型的子类,java,inheritance,factory,Java,Inheritance,Factory,对于一个项目,我必须创建代表不同类型用户的对象。所有类型都是从超类User继承的子类。在本例中,我们有一名学生、一名教师和一名协调员。每个类都有特定方法的不同实现。 为了了解我们正在处理的是哪种类型的用户,需要从数据库中提取一条记录,包括一个用户角色。根据角色的不同,将创建不同类型的用户子类。 目前我正在使用一个switch语句,如下所示。然而,由于它们都有相同的构造函数,这导致了代码的重复。如何才能更优雅/高效地完成这项工作 public void makeUserTypes() {

对于一个项目,我必须创建代表不同类型用户的对象。所有类型都是从超类User继承的子类。在本例中,我们有一名学生、一名教师和一名协调员。每个类都有特定方法的不同实现。 为了了解我们正在处理的是哪种类型的用户,需要从数据库中提取一条记录,包括一个用户角色。根据角色的不同,将创建不同类型的用户子类。 目前我正在使用一个switch语句,如下所示。然而,由于它们都有相同的构造函数,这导致了代码的重复。如何才能更优雅/高效地完成这项工作

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);
}

为什么不尝试使用角色类型的枚举,然后简单地使用一个名为role的额外字段的用户类型呢?假设这些只是数据类。然后,当你需要做一些逻辑时,你可以切换角色。每种类型都有它们自己的特定方法的实现。另一种方法是使用反射,你从数据库中获得的角色可以映射到一个类型名中,然后你只需实例化该类型。反射听起来很有趣,我对编程和java比较陌生。这将是通过使用Class.forName()实现的?因为您需要将参数传递给构造函数,所以不仅仅是这样。尝试查看。感谢您的输入!我明天会调查一下,看看能不能弄明白。我想ctor.create()会正确使用参数?@manolo是的,我的错。我忘了添加它们:/now修复了它。我用Map进行了实现。工作起来很有魅力!
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);
}
private static UserCtor<?>[] ctors = {Student::new, Teacher::new, Coordinator::new};

public void makeUserTypes() {
    user = ctors[idRole].create(idUser, username, firstName, lastName);
}