好吧,这个问题看起来很像:
在程序中替换或替换if..else if..else树的最佳方法是什么?
考虑这个问题已关闭!
我想重构看起来像这样的代码:
String input; // input from client socket.
if (input.equals(x)) {
doX();
} else if (input.equals(y)) {
doY();
} else {
unknown_command();
}
Run Code Online (Sandbox Code Playgroud)
检查来自套接字的输入以执行某些操作的代码,但我不喜欢这种if else结构,因为每次向服务器(代码)添加新命令时都必须添加一个新的if else,这是丑陋的.删除命令时if else也必须修改.
在收集这些命令Map<String, Command>,其中Command是interface用一个execute()方法.
Map<String, Command> commands = new HashMap<String, Command>();
// Fill it with concrete Command implementations with `x`, `y` and so on as keys.
// Then do:
Command command = commands.get(input);
if (command != null) {
command.execute();
} else {
// unknown command.
}
Run Code Online (Sandbox Code Playgroud)
为了更进一步,您可以考虑通过扫描实现特定接口(Command在本例中)或类路径中的特定注释的类来动态填充地图.Google Reflections可能会对此有所帮助.
更新(来自评论)您还可以考虑将Instantsoup的答案与我的答案结合起来.在该buildExecutor()方法期间,首先从a获取命令Map,如果该命令不存在Map,则尝试加载关联的类并将其放入Map.懒加载的排序.这比在我的答案中扫描整个类路径更有效,并且每次都像在Instantsoup的答案中一样创建它.
| 归档时间: |
|
| 查看次数: |
1381 次 |
| 最近记录: |