调制添加新字符串 - >方法调用

时间:2011-02-20 14:45:19

标签: java modularization

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

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的相关方法。

有什么想法吗?

谢谢

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

4 个答案:

答案 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 {...}