Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加新字符串->方法调用的调制_Java_Modularization - Fatal编程技术网

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

Java 添加新字符串->方法调用的调制,java,modularization,Java,Modularization,如果我有一个执行以下操作的程序: if(input=='abc'){do x} if(input=='def'){do y} 将来,我可能想添加另一段代码,如下所示: if(input=='ghy'){do x} 如您所见,我为不同的条件添加了一个新的“if”语句,但使用了相同的函数X。 未来的代码可能会有很多不同的IF语句或开关,它们都是比较字符串和字符串,然后执行函数。考虑到未来的扩展,我想知道是否有一种可能的“更整洁”、“模块化”的方式来实现相同的结果 遗憾的是,我不能将字符串与哈希表

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

if(input=='abc'){do x}
if(input=='def'){do y}
将来,我可能想添加另一段代码,如下所示:

if(input=='ghy'){do x}
如您所见,我为不同的条件添加了一个新的“if”语句,但使用了相同的函数X。 未来的代码可能会有很多不同的IF语句或开关,它们都是比较字符串和字符串,然后执行函数。考虑到未来的扩展,我想知道是否有一种可能的“更整洁”、“模块化”的方式来实现相同的结果

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

有什么想法吗

多谢各位


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

我想您可以随时使用映射和映射到匿名可运行实现:

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

...

myMap.get(input).run();

我想您可以始终使用映射并映射到匿名可运行实现:

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

...

myMap.get(input).run();
也许你可以使用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();
干杯

也许您可以使用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();

干杯

很多国际单项体育联合会总是告诉我们,我们可以做得更好。在您的情况下,更好的选择是使用设计模式,例如。您将拥有良好的实现,可以动态更改,并且您的代码将比ifs实现更易于维护

请看一下您案例的适应责任链:

主要内容:

基类:

链中的类:


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

请看一下您案例的适应责任链:

主要内容:

基类:

链中的类:


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

但简单地说,你可以这样做:

1-使用程序必须调用的方法创建命令接口,例如doTask

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

3-创建将命令X和Y映射到逻辑名称的映射

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


5-然后,您的程序会根据输入查找配置文件,以了解要运行的命令。

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

但简单地说,你可以这样做:

1-使用程序必须调用的方法创建命令接口,例如doTask

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

3-创建将命令X和Y映射到逻辑名称的映射

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


5-然后,您的程序会查找配置文件,以了解根据输入运行哪个命令。

几乎和使用java.lang.reflect.Method.Ah一样可怕,这是一个想法。但是,如果这些“方法”都在一个类中呢。IE:Foo.x,Foo.y,Foo.z。除了在线程中使用Runnables之外,我还没有太多其他的东西,所以不确定这是否可以实现。您可以创建一个带有方法op的接口,然后为每个操作x,y创建一个实现类。然后将所需的实现与每个字符串关联。运行方法:map.getabc.op;我不确定你的确切意思,但有两件事:Runnable只是一个带有run方法的接口;除了被线程使用之外,它没有任何特殊的线程意义。其次,本例中的匿名Runnable只是一个样板文件,一种在给定时间执行您想要执行的代码的方法。它可以调用任何方法,它可以访问周围类的方法和字段、全局内容以及周围方法中的任何最终变量,但当然它不能访问在您定义匿名可运行项时尚未定义的变量。这几乎和使用java.lang.reflect.method.Ah一样可怕,这是一个想法。但是,如果这些“方法”都在一个类中呢。IE:Foo.x,Foo.y,Foo.z。除了在线程中使用Runnables之外,我还没有太多其他的东西,所以不确定这是否可以实现。您可以创建一个带有方法op的接口,然后为每个操作x,y创建一个实现类。然后将所需的实现与每个字符串关联。经办人:马

p、 getabc.op;我不确定你的确切意思,但有两件事:Runnable只是一个带有run方法的接口;除了被线程使用之外,它没有任何特殊的线程意义。其次,本例中的匿名Runnable只是一个样板文件,一种在给定时间执行您想要执行的代码的方法。它可以调用任何方法,它可以访问周围类的方法和字段、全局内容以及周围方法中的任何最终变量,但当然它不能访问在您定义匿名可运行项时尚未定义的变量。不过有一点很挑剔,如果要在布尔表达式中使用字符串,请使用equals或equalsIgnoreCase方法,而不是==。当然,在Java字符串中使用双引号。如果你这样做了,你会有一个接口列出所有方法,还是每个方法都需要一个接口?不,只能使用一个接口。用谷歌搜索命令设计模式,因为我认为这就是你要寻找的。@Hover,@johusman只是一个想法,将来如果发生任何哈希冲突,会调用错误的方法吗?任何可能发生的事情。这就是equals方法的作用。如果hashcode相同,那么equals应该对不同的对象进行排序。如果两个hashCode都相同,并且equal返回true,那么这不是冲突,因为两个字符串实际上是一个相同的字符串。不过有一点很挑剔,如果要在布尔表达式中使用字符串,请使用equals或equalsIgnoreCase方法,而不是==。当然,在Java字符串中使用双引号。如果你这样做了,你会有一个接口列出所有方法,还是每个方法都需要一个接口?不,只能使用一个接口。用谷歌搜索命令设计模式,因为我认为这就是你要寻找的。@Hover,@johusman只是一个想法,将来如果发生任何哈希冲突,会调用错误的方法吗?任何可能发生的事情。这就是equals方法的作用。如果hashcode相同,那么equals应该对不同的对象进行排序。如果两个hashCode都相同,并且equal返回true,那么这不是冲突,因为这两个字符串实际上是一个相同的字符串。太棒了,我会试试。谢谢:请注意,如果字符串中包含空格或特殊字符,则会变得很棘手。但即使enum是一个合理的选择,只需稍作修改。干杯嗯,字符串可能在多种情况下包含空格。解决这个问题的最佳方法是什么?@lucho为什么分号在ghy后面,有什么语法可以调用方法吗default@guesswork-最好的方法是提供一个将要使用的查找方法,而不是valueOf。在阅读了这篇有趣的文章之后,您可以尝试实现这样一种方法:太棒了,我来试试。谢谢:请注意,如果字符串中包含空格或特殊字符,则会变得很棘手。但即使enum是一个合理的选择,只需稍作修改。干杯嗯,字符串可能在多种情况下包含空格。解决这个问题的最佳方法是什么?@lucho为什么分号在ghy后面,有什么语法可以调用方法吗default@guesswork-最好的方法是提供一个将要使用的查找方法,而不是valueOf。在阅读了这个有趣的线程之后,您可以尝试实现这样一个方法:如果命令方法需要参数,是否可以这样做?是的,有几种方法可以实现,但是您可以简单地传递一个映射来传递参数。你的命令会知道怎么处理的我一定很不明白这是怎么回事。。很抱歉假设我有一个接口FooInterface和一个方法xString字符串,由类Foo实现。我创建了一个地图,但我现在唯一能做的就是putabc,new Foo.xString y。但是如果在填充地图时我不知道我想要的字符串y是什么呢?如果我想在通话时传递字符串y怎么办?谢谢doTask方法应该是doTaskMap params如果命令方法需要参数,可以这样做吗?是的,有几种方法可以这样做,但是您可以简单地传递一个映射来传递参数。你的命令会知道怎么处理的我一定很不明白这是怎么回事。。很抱歉假设我有一个接口FooInterface和一个方法xString字符串,由类Foo实现。我创建了一个地图,但我现在唯一能做的就是putabc,new Foo.xString y。但是如果在填充地图时我不知道我想要的字符串y是什么呢?如果我想在通话时传递字符串y怎么办?谢谢doTask方法应该是doTaskMap参数