将Object类型作为方法参数传递总是设计不佳的标志吗



假设我有以下枚举

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()即可

作为khelwood解决方案的替代方案(例如,在无法更改UserAchievement的结构的情况下(,考虑主题提取操作确实属于EmailType可能是有意义的。如果EmailTypegenerateEmailSubject方法,这将使单元更有凝聚力,而不是在它和当前定义generateEmailSubject()的任何类之间扩展逻辑。

public enum EmailType {
FORGET_PASSWORD {
@Override
public String generateEmailSubject(Object obj) {
User user = (User) obj;
return "Forget password " + user.getEmail();
}
},
ACHIEVMENT_UNLOCK {
@Override
public String generateEmailSubject(Object obj) {
Achievment achievment = (Achievment) obj;
return "Achievment Unlock:" + achievment.getTitle();
}
};
public abstract String generateEmailSubject(Object obj);
}

最新更新