Java 创建一个包含switch语句的方法,该语句基于传递到该方法中的一个参数

Java 创建一个包含switch语句的方法,该语句基于传递到该方法中的一个参数,java,string,switch-statement,Java,String,Switch Statement,我正在编写一个方法,createMessage(),它将接受两个参数——消息类型和消息本身 到目前为止,我通过使用String类型的两个参数实现了这一点。消息类型将是以下三种类型之一:;指示、错误或成功。该方法包含一个switch语句,该语句将根据消息的类型以某种方式编辑消息 该方法将如下所示: public void createMessage(String messageType, String message) { String output = ""; switch(me

我正在编写一个方法,
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(“指令”,“输入您的名字:”)
,而我不希望在给出消息类型时使用引号-
createMessage(说明,“输入您的姓名:”)


问题:实现这一点的最佳方法是什么?

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

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;
}

根据注释,您可以使用如下枚举:

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);
    }
}  
您的方法将按照以下方式进行重构:

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);
    }
}  
但是,如果确实需要在消息实体上具有行为,请不要将其委托给外部方法,而是创建一个消息类:

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),您将拥有更好(更容易)的可测试性。

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

因此,您也应该考虑使用三个独立的函数。
另一种选择是使用
Message
作为基类,并从中派生
ErrorMessage
等。每个子类都知道如何处理输出。

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

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);
}

考虑创建EnUM?枚举是这个答案的最佳选择。看看@youssef-Lahoud的答案