java - 将对象类型作为方法参数传递是否总是设计不佳的标志?

标签 java oop

假设我有以下枚举

public enum EmailType {
    FORGET_PASSWORD, ACHIEVMENT_UNLOCK, WELCOME
}

我有一个根据类型生成电子邮件主题的函数(但它仍然需要动态数据),例如

public String generateEmailSubject(EmailType emailType, Object obj) {
    String subject;
    switch(emailType) {
        case WELCOME:
            User user = (User) obj;
            subject = "Hello " + user.getFirstName();
        case FORGET_PASSWORD:
            User user = (User) obj;
            subject = "Forget password " + user.getEmail();
            break;
        case ACHIEVMENT_UNLOCK:
            Achievment achievment = (Achievment) obj;
            subject = "Achievment Unlock:" + achievment.getTitle();
            break;
    }

    return subject;
}

这是不好的做法吗?如果是这样,处理这个问题的好设计是什么?也许每个 EmailType 都有一个单独的方法,但这可能会导致很多方法,并且当我需要更改它们时,主题不会集中。

最佳答案

你可以为此使用多态性。

interface Subjectable {
    String getSubject();
}

class Achievement implements Subjectable {
    ...
    @Override
    public String getSubject() {
        return "Achievement unlocked: " + getTitle();
    }
}

class User implements Subjectable {
    ...
    @Override
    public String getSubject() {
        return "Forgot password: " + getEmail();
    }
}

那么您不需要显式检查对象的类型:您只需对其调用 getSubject()

关于java - 将对象类型作为方法参数传递是否总是设计不佳的标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53087229/

相关文章:

java - 策略设计模式——在带有计数器的策略之间进行选择

php - $this 不在数据库连接基类的对象上下文中

java - 在Java中从扫描仪读取可变宽度标记?

Java:使用replaceAll()替换字符串中的所有URL(URL包含 '\')

java - 使用已检查的异常重写方法

c++ - 类的私有(private)函数可以从本地函数调用吗?

vb.net - 有哪些好的资源可以帮助 VB6 开发人员团队了解面向对象范例?

java - 通过android模拟器在appium中启动apk文件失败

java - 从 ManyToMany 链接对象派生属性

database - 对象数据库的优点和缺点是什么?