Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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_Android_Hashmap_Runnable_Enumeration - Fatal编程技术网

Java 将字符串链接到函数

Java 将字符串链接到函数,java,android,hashmap,runnable,enumeration,Java,Android,Hashmap,Runnable,Enumeration,在Java(Android)中有没有一种方法可以链接字符串和函数?我的目标是根据从单独方法接收到的字符串来运行某个函数 ie如果myString==“building”,则执行buildingmethod() 我正在考虑使用如下的哈希映射: HashMap<String,Runnable> hashDBTableUpdateRef = new HashMap<>(); hashDBTableUpdateRef.put("house",this.housemethod())

在Java(Android)中有没有一种方法可以链接字符串和函数?我的目标是根据从单独方法接收到的字符串来运行某个函数

ie如果myString==“building”,则执行buildingmethod()

我正在考虑使用如下的哈希映射:

HashMap<String,Runnable> hashDBTableUpdateRef = new HashMap<>();
hashDBTableUpdateRef.put("house",this.housemethod());
hashDBTableUpdateRef.put("shed",this.shedmethod());
hashDBTableUpdateRef.put("barn",this.barnmethod());
由于以下操作和自定义枚举,我无法使用参数创建一个通用方法,例如
函数anyBuilding(stringbuildingtype)
。有什么想法吗?
是否可以运行
是前进的方向

例如:


谢谢,

例如,您可以定义实现
命令的enum
接口

interface Command {
        void execute();
    }

    enum MyEnum implements Command {
        A() {
            public void execute() {
                System.out.println("A");
            }
        },
        B {
            public void execute() {
                System.out.println("B");
            }
        };
    }
现在,您只需要将字符串转换为enum
MyEnum.valueOf(“someString”)
返回的对象可以调用
execute
方法


但主要的问题仍然存在,你们为什么要这样做,你们想实现什么?因为这可能是更好的方法。

例如,您可以定义实现
命令的enum
接口

interface Command {
        void execute();
    }

    enum MyEnum implements Command {
        A() {
            public void execute() {
                System.out.println("A");
            }
        },
        B {
            public void execute() {
                System.out.println("B");
            }
        };
    }
现在,您只需要将字符串转换为enum
MyEnum.valueOf(“someString”)
返回的对象可以调用
execute
方法


但主要的问题仍然存在,你们为什么要这样做,你们想实现什么?因为这可能是一种更好的方法。

您很快就能得到您想要的,但是您应该用一个特定的接口替换通用的
可运行的

public interface MyInterface
{
    public <return-type> doSomething(<parameters>) throws <exceptions>;
}
公共接口MyInterface
{
公共剂量;
}
这是一种改进初始设计的语义方法,因为您可以命名方法、添加参数和异常、添加更多方法等


您的设计的其余部分(针对每个所需行为的特定实现,并将它们存储在一个映射中)是可以的。

您的设计很接近您想要的,但是您应该用特定的接口替换通用的
可运行的

public interface MyInterface
{
    public <return-type> doSomething(<parameters>) throws <exceptions>;
}
公共接口MyInterface
{
公共剂量;
}
这是一种改进初始设计的语义方法,因为您可以命名方法、添加参数和异常、添加更多方法等



您设计的其余部分(针对每个所需行为的特定实现,并将它们存储在地图中)可以。

我觉得这里的设计味道您可能是对的。请提供更多上下文,例如,该字符串来自何处?您没有给我们任何东西来确定哪种方法可能最合适。你的建议并非天生就不好,但很普通。您的特定问题可能提供更好的特定解决方案。@Jammo,任何避免反射的方法都是避免反射的好理由。只有在你绝对必须的情况下才使用反射。我觉得这里的设计味道你很可能是对的。请提供更多的上下文,例如,字符串来自哪里?你没有给我们任何东西来确定什么方法可能最合适。你的建议并非天生就不好,但很普通。您的特定问题可能提供更好的特定解决方案。@Jammo,任何避免反射的方法都是避免反射的好理由。只有在绝对必要时才使用反射。也许。可能另一方面,也可能是
Runnable
实际上捕获了目标任务的一种特定表示形式,在这种情况下,创建一种不同的类型来表示同一事物将弊大于利。@corse的John Bollinger,这取决于开发人员的决定。我的意思是,他/她不应该感到受到
Runnable
的限制。也许吧。可能另一方面,也可能是
Runnable
实际上捕获了目标任务的一种特定表示形式,在这种情况下,创建一种不同的类型来表示同一事物将弊大于利。@corse的John Bollinger,这取决于开发人员的决定。我的意思是他/她不能感到受
Runnable
的限制。这太完美了,谢谢,真是一种享受
mapDbUpdater=newHashMap();mapDbUpdater.put(“shed”,new命令(){@Override public void doSomething(){shed.refreshDbContents();}})然后我使用
尝试{Command UpdateCommand=mapDbUpdater.get(tableNameToUpdate);UpdateCommand.doSomething();
@Jammo-动态重写该方法是完全没有必要的。使用
MyEnum.valueOf(“shed”).execute()
@OldCurmudgeon,你是说
mapDbUpdater.valueOf(“shed”).doSomething())5944{Command updaterCommand=mapDbUpdater.get(tableNameToUpdate);updaterCommand.doSomething();
@Jammo-动态重写该方法完全没有必要。使用
MyEnum.valueOf(“shed”).execute()
@OldCurmudgeon,你是说
mapDbUpdater.valueOf(“shed”).doSomething();
?啊,不错。谢谢