我有这样的枚举:
public enum Email{
WELCOME,
LOGIN
}
EmailService
具有以下方法签名:
public void sendEmail(String from, String subject, String[] to, Map<String, String> props, String templateFileName)
我想要这样的 API:
Email.WELCOME.send(from, subject, to, welcomeProp1, welcomeProp2....)
Email.LOGIN.send(from, subject, to, loginProp1, loginProp2....)
为了实现这一点,我尝试向枚举字段添加特定方法:
public enum Email{
WELCOME{
public void send(String param1,String param2,String param3,String param4){
....
}
},
LOGIN{
public void send(String anotherParam1,String anotherParam2,String anotherParam3){
....
}
}
}
但我发现我无法在枚举之外调用此方法。为了实现它,我需要创建抽象方法并在每个枚举值中重写。但问题是这些方法的签名不同,无法实现。
有什么想法吗?
最佳答案
在这种情况下,您可以使用多态性。首先定义一些接口(interface),例如:
public interface Message {
}
然后您应该向枚举添加一个抽象方法:
public abstract void send(Message message);
之后,创建两个子类 - 第一个用于 WELCOME,第二个用于 LOGIN:
class WelcomeMessage implements Message {
private String param1;
private String param2;
private String param3;
private String param4;
// constructor, getters
}
class LoginMessage implements Message {
private String anotherParam1;
private String anotherParam2;
private String anotherParam3;
// constructor, getters
}
然后添加 send()
方法的实现:
public enum Email {
WELCOME {
public void send(Message message) {
WelcomeMessage wm = (WelcomeMessage) message;
....
}
},
LOGIN {
public void send(Message message) {
LoginMessage lm = (LoginMessage) message;
....
}
}
}
UPD。 @gstackoverflow 提到可以调用具有“不正确”实现的方法。我想我知道如何防止这种情况发生。
public enum Email {
WELCOME {
protected void sendInternal(Message message) {
WelcomeMessage wm = (WelcomeMessage) message;
....
}
protected Class<? extends Message> getSupportedClass() {
return WelcomeMessage.class;
}
},
LOGIN {
protected void sendInternal(Message message) {
LoginMessage lm = (LoginMessage) message;
....
}
protected Class<? extends Message> getSupportedClass() {
return LoginMessage;
}
};
public static void send(Message message) {
for (Email email : values()) {
if (email.getSupportedClass().equals(message.getClass()) {
email.sendInternal(message);
}
}
}
protected abstract void sendInternal(Message message);
protected abstract Class<? extends Message> getSupportedClass();
}
关于java - 如何在枚举之外调用枚举值特定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311392/