java - 如何在枚举之外调用枚举值特定方法?

标签 java enums

我有这样的枚举:

  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/

相关文章:

java - 多数据源配置

java - 我在从类调用代码时遇到问题

java - 为什么我要加上 "static"

java - 重写枚举中的抽象方法时避免代码重复

Delphi 枚举到 Variant 作为 varInteger 而不是 varUInt32

Java 迷宫求解器

java - 如何在Spring MVC中更新静态资源而不重建?

java - 为什么 boolean 对象在 Java 中有一个公共(public)构造函数?

java - Android 客户端套接字 IOException

php - 如何像文档中那样为 Symfony 2.7 选择实现 ENUM 类?