根据传递给方法的其中一个参数创建一个包含switch语句的方法

时间:2016-02-24 22:14:15

标签: java string switch-statement

我正在编写一个方法createMessage(),它将采用两个参数 - 消息类型和消息本身。

到目前为止,我已通过同时使用String类型的两个参数来实现此目的。消息类型将是三种中的一种;指导,错误或成功。该方法包含一个switch语句,它将根据其类型以某种方式编辑消息。

该方法看起来像这样:

public void createMessage(String messageType, String message) {
    String output = "";
    switch(messageType) {
    case "instruction":
        output = "INSTRUCTION: " + message + "\n";
        //edits required for an instruction
        break;  
    case "error":
        output = "ERROR: " + message + "\n";
        //edits required for an error
        break;    
    case "success":
        output = "SUCCESS: " + message + "\n";
        //edits required for a success
        break;    
    default:
        throw new IllegalArgumentException("Invalid message type: " + messageType);
}   

此方法将被称为createMessage("instruction", "Enter your name:");,而我宁愿不必使用引号来提供消息类型 -​​ createMessage(instruction, "Enter your name:");

问题:实现这一目标的最佳方式是什么?

4 个答案:

答案 0 :(得分:3)

根据评论,您可以使用以下枚举:

public enum MessageType {
    INSTRUCTION, ERROR, SUCCESS;    
}

您的方法将重构如下:

public void createMessage(MessageType messageType, String message) {
    String output = "";
    switch(messageType) {
    case INSTRUCTION:
        output = "INSTRUCTION: " + message + "\n";
        //edits required for an instruction
        break;  
    case ERROR:
        output = "ERROR: " + message + "\n";
        //edits required for an error
        break;    
    case SUCCESS:
        output = "SUCCESS: " + message + "\n";
        //edits required for a success
        break;    
    default:
        throw new IllegalArgumentException("Invalid message type: " + messageType);
    }
}  

但是如果你真的需要在你的消息实体上有行为,不要将它委托给外部方法,而是创建一个Message类:

public class Message {
    private MessageType type;
    private String text;

    public Message(MessageType type, String text) {
        this.type = type;
        this.text = text;
    }

    public String buildOutput() {
        return type + text;
    }

    // other behaviors here
}

并在您的申请中强制执行其责任,根据类型和文本处理所需的行为。

这将强制执行单一责任原则(SRP),您将拥有更好(更容易)的可测试性。

答案 1 :(得分:2)

您可以使用枚举。如果您不知道如何使用它们,请查看this教程。

public enum MessageType{
    INSTRUCTION, ERROR, SUCCESS
}

另外,你可以用干净的方式打开枚举:

public void createMessage(MessageType messageType, String message) {
    String output = "";
    switch(messageType) {
    case INSTRUCTION://code break;
    case ERROR://code break;
    case SUCCESS://code break;
}

答案 2 :(得分:1)

我建议使用枚举,因为您可以确保传递给该方法的所有消息类型都有效。

public enum MessageType {
   ERROR, INSTRUCTION, SUCCESS;    
}

然后,您可以在消息类型上使用name()方法获取枚举成员的名称,然后将其转换为大写。在MessageType枚举中实现它可能是更好的做法,但为了适应您的设计,我将其分开。

public String createMessage(MessageType type, String message) {
   return String.format("%s: %s%n", type.name().toUpperCase(), message);
}

答案 3 :(得分:0)

枚举将是一个巨大的进步,因为您明确定义了要处理的案例。但它不会帮助你摆脱有时候被认为是代码气味的开关声明。

因此,您还应考虑使用三个单独的功能。

另一种选择是使用Message作为基类,并从中导出ErrorMessage等。每个子类都知道如何处理输出。