重构java代码

Alf*_*red 6 java refactoring

好吧,这个问题看起来很像:

在程序中替换或替换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也必须修改.

Bal*_*usC 8

在收集这些命令Map<String, Command>,其中Commandinterface用一个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的答案中一样创建它.

  • 你可以使用像Spring这样的东西将实现注入到地图中,但是你无法解决这样的事实:你有**触摸某些代码以添加新的逻辑分支,无论是if()块还是map.add(new Command()); 或者在Spring XML文件中. (2认同)