【问题标题】:How can I write a method to easily create different types of subclasses如何编写一种方法来轻松创建不同类型的子类
【发布时间】:2020-06-14 20:46:27
【问题描述】:

对于一个项目,我必须创建代表不同类型用户的对象。所有类型都是继承自超类 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;
        }
    }

【问题讨论】:

  • 为什么不尝试使用角色类型的枚举,然后简单地使用带有称为角色的额外字段的用户类型?假设这些只是数据类。然后,当您需要执行一些逻辑时,您可以切换角色。
  • 每种类型都有自己的特定方法实现
  • 另一种方法是使用反射,您从数据库中获得的角色可以映射到类型名称中,然后您只需实例化该类型。
  • 反射听起来很有趣,我对编程和java比较陌生。那将是使用 Class.forName() ?
  • 不仅如此,您还需要将参数传递给构造函数。试试看this

标签: java inheritance factory


【解决方案1】:

功能界面如何,带有开关或地图?

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

【讨论】:

  • 感谢您的意见!明天我会研究它,看看我能不能解决它。我假设 ctor.create() 会带参数对吗?
  • @manolo 是的,我的错。我忘了添加它们:/现在修复它
  • 我使用 Map 来实现。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 2014-09-04
  • 1970-01-01
  • 2020-05-04
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多