根据传入方法的参数之一创建包含 switch 语句的方法
Creating a method which contains a switch statement based on one of the parameters passed into the method
我正在编写一个方法,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:");
.
问题:实现此目标的最佳方法是什么?
你可以使用枚举。如果您不知道如何使用它们,请查看 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;
}
根据评论,您可以使用如下枚举:
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);
}
}
但是如果你真的需要在你的消息实体上有行为,不要将它委托给外部方法,而是创建一个消息 class:
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),并且您将拥有更好(和更容易)的可测试性。
枚举将是一个巨大的改进,因为您明确定义了要处理的案例。但它不会帮助您摆脱有时被认为是代码味道的 switch 语句。
因此您还应该考虑使用三个独立的函数。
另一种选择是使用 Message
作为基础 class 并从中导出 ErrorMessage
等。每个 subclass 都会知道如何处理输出。
我建议使用枚举,这样您就可以确保传递给该方法的所有消息类型都有效。
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);
}
我正在编写一个方法,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:");
.
问题:实现此目标的最佳方法是什么?
你可以使用枚举。如果您不知道如何使用它们,请查看 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;
}
根据评论,您可以使用如下枚举:
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);
}
}
但是如果你真的需要在你的消息实体上有行为,不要将它委托给外部方法,而是创建一个消息 class:
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),并且您将拥有更好(和更容易)的可测试性。
枚举将是一个巨大的改进,因为您明确定义了要处理的案例。但它不会帮助您摆脱有时被认为是代码味道的 switch 语句。
因此您还应该考虑使用三个独立的函数。
另一种选择是使用 Message
作为基础 class 并从中导出 ErrorMessage
等。每个 subclass 都会知道如何处理输出。
我建议使用枚举,这样您就可以确保传递给该方法的所有消息类型都有效。
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);
}