如果我有一个程序执行以下操作:
if(input=='abc'){do x}
if(input=='def'){do y}
将来,我可能想要添加另一段代码:
if(input=='ghy'){do x}
如您所见,我正在使用SAME函数X为不同的条件BUT添加新的“if”语句。 未来的代码有可能有很多不同的IF语句(或开关),所有这些都是比较字符串和字符串然后执行一个函数。考虑到未来的扩展,我想知道是否有可能实现相同结果的“整体”,“模块化”方式。
遗憾的是我无法将String与Java中的哈希表(String,方法)中的Method调用结合起来。这样我就可以在哈希表中存储任何新程序并获取该String的相关方法。
有什么想法吗?
谢谢
编辑:感谢大家的解决方案。我在很短的时间内收到的回复数量和质量让我感到惊讶。
答案 0 :(得分:4)
也许你可以使用enum
。例如:
public enum InputType
{
abc, def
{
@Override
public void x()
{
System.out.println("Another method");
}
},
ghy;
public void x()
{
System.out.println("One method");
}
}
进一步说:
InputType.valueOf("abc").x();
干杯!
答案 1 :(得分:1)
我猜你总是可以使用Map< String,Runnable>并映射到匿名的Runnable实现:
myMap.put("abc", new Runnable() { public void run() { do x } });
...
myMap.get(input).run();
答案 2 :(得分:1)
你应该看一下命令模式。有几种方法可以实现它,像Spring这样的框架可以帮助您以干净的方式进行操作。
但是以一种简单的方式,你可以做到这一点:
1 - 使用您的程序必须调用的方法创建一个Command接口,比如doTask()
2 - 为命令X和Y创建类,实现Command接口。
3 - 创建一个Map<String, Command>
,将您的命令(X和Y)映射到逻辑名称
4 - 创建一个您选择的配置文件,比如一个.properties文件,它将您的输入映射到您的命令名称:abc = X,def = Y,ghi = X
5-您的程序然后在配置文件上查找以根据输入知道要运行的命令。
答案 3 :(得分:0)
很多ifs总是告诉我们,我们可以做得更好。在您的情况下,更好的选择是使用设计模式,例如Chain of responsibility。您将拥有良好的实现,您可以动态更改,并且您的代码将比实现更容易维护。
看看这个适应你的案件的责任链:
主要强>
public static void main(String[] args) {
ClassA classA = new ClassA(Arrays.asList("abc", "ghi"));
ClassB classB = new ClassB(Arrays.asList("def"));
classA.setNextInChain(classB); // you can always write Builder to do this
String input = "def";
classA.execute(input);
}
<强> BaseClass的:强>
public abstract class BaseClass {
private Collection<String> patterns = Collections.EMPTY_LIST;
protected BaseClass nextInChain;
protected abstract void doMethod(); // your doA, doB methods
public void execute(String input) {
// this replace many ifs in your previous implementation
if (patterns.contains(input)) {
doMethod();
} else {
nextInChain.execute(input);
}
}
public void setPatterns(Collection<String> patterns) {
this.patterns = patterns;
}
public void setNextInChain(BaseClass nextInChain) {
this.nextInChain = nextInChain;
}
}
链中的类:
public class ClassA extends BaseClass {
ClassA(Collection<String> patterns) {
setPatterns(patterns);
}
@Override
protected void doMethod() {
// do A
}
}
public class ClassB extends BaseClass {...}