1

如果我有一个执行以下操作的程序:

if(input=='abc'){do x}
if(input=='def'){do y}

将来,我可能想添加另一段代码,如下所示:

if(input=='ghy'){do x}

如您所见,我正在使用 SAME 函数 X 为不同的条件 BUT 添加一个新的“if”语句。未来的代码可能会有许多不同的 IF 语句(或开关),所有这些都在比较字符串与一个字符串,然后执行一个函数。考虑到未来的扩展,我想知道是否有一种可能的“更整洁”、“模块化”的方式来实现相同的结果。

很遗憾,我不能将字符串与 Java 中的哈希表(字符串,方法)中的方法调用结合起来。这样我就可以将任何新过程存储在哈希表中并获取该字符串的相关方法。

有任何想法吗?

谢谢

编辑:谢谢大家的解决方案。我对在这么短的时间内收到的回复的数量和质量感到惊讶。

4

4 回答 4

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();

干杯!

于 2011-02-20T15:01:29.563 回答
1

你应该看看命令模式。有几种实现方式,Spring 等框架可以帮助您以一种干净的方式实现它。

但以简单的方式,您可以执行以下操作:

1-使用您的程序必须调用以执行任务的方法创建一个命令接口,例如 doTask()

2-为命令 X 和 Y 创建类,实现命令接口。

3-创建一个Map<String, Command>将您的命令(X 和 Y)映射到逻辑名称的

4-创建一个您选择的配置文件,比如一个 .properties 文件,它将您的输入映射到您的命令名称:abc=X、def=Y、ghi=X

5-然后您的程序在配置文件上进行查找,以根据输入知道要运行哪个命令。

于 2011-02-20T15:11:43.400 回答
1

我想您总是可以使用 Map<String, Runnable> 并映射到匿名 Runnable 实现:

myMap.put("abc", new Runnable() { public void run() { do x } });

...

myMap.get(input).run();
于 2011-02-20T14:55:09.220 回答
0

很多如果总是告诉我们,我们可以做得更好。在您的情况下,更好的选择是使用设计模式,例如责任链。您将拥有可以动态更改的良好实现,并且您的代码将比 ifs 实现更易于维护。

看看这个适应您的案例的责任链:

主要的:

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);
}

基类:

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 {...}
于 2011-02-20T15:04:24.830 回答