在脚本/动态语言中,这似乎很简单……但是在Java中似乎并非如此,或者我只是缺少了一些东西。
这是我的当前代码:
switch (selectedModel) {
case "author":
switch (selectedAction) {
case "create":
AuthorController.create();
break;
case "read":
AuthorController.read(promptForID());
break;
case "update":
AuthorController.update(promptForID());
break;
case "destroy":
// AuthorController.destroy(promptForID());
break;
}
break;
case "book":
// now I have to repeat all the same code...
对于“ book”,我将不得不再次重复所有相同的代码。我认为有更好的方法。
答案 0 :(得分:4)
使用静态方法不能执行此操作。创建一个界面:
public interface CrudController {
void create();
void read(String id);
void update(String id);
void destroy(String id);
}
现在所有的控制器都实现了该接口,那么您的代码将变为:
CrudController controller;
switch (selectedModel) {
case "author":
controller = new AuthorController();
break;
case "book":
controller = new BookController();
break;
...
default:
throw new IllegalArgumentException("Unknown model: " + selectedModel);
}
switch (selectedAction) {
case "create":
controller.create();
break;
case "read":
controller.read(promptForID());
break;
case "update":
controller.update(promptForID());
break;
case "destroy":
// controller.destroy(promptForID());
break;
default:
throw new IllegalArgumentException("Unknown action: " + selectedAction);
}
答案 1 :(得分:2)
为所有公共类(可能是sudo docker-compose up
)创建一个公共接口,然后执行以下操作:
Controller
答案 2 :(得分:0)
可以使用某种Factory模式消除外部开关。 并使用一种策略模式来嵌套开关。
下面的粗略实现(希望您使用的是Java 8 +)。
public void someServiceMethod(String selectedModel, Action selectedAction, String input) {
ActionController controller = ActionControllerFactory.forModel(selectedModel);
selectedAction.accept(controller, input);
}
public interface ActionController {
void create();
void read(String id);
void update(String id);
void destroy(String id);
}
public enum Action implements BiConsumer<ActionController, String> {
CREATE {
@Override
public void accept(ActionController controller, String input) {
controller.create();
}
},
READ {
@Override
public void accept(ActionController controller, String input) {
controller.read(input);
}
},
UPDATE {
@Override
public void accept(ActionController controller, String input) {
controller.update(input);
}
},
DESTROY {
@Override
public void accept(ActionController controller, String input) {
controller.destroy(input);
}
}
}