假设我有以下枚举
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解决方案的替代方案(例如,在无法更改User
和Achievement
的结构的情况下(,考虑主题提取操作确实属于EmailType
可能是有意义的。如果EmailType
有generateEmailSubject
方法,这将使单元更有凝聚力,而不是在它和当前定义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);
}