Java:如何通过字符串内容选择/调用函数?

标签 java reflection

我有一个列表和函数。

我想迭代列表并调用匹配列表元素的函数。 我怎样才能以比在 if 或 switch 中比较名称更优雅的方式做到这一点?

class C
{
  String [] lst = {"foo", "bar", "zoo"};

  void foo () { /* ... */ }
  void bar () { /* ... */ }

  void NotSoElegant ()
  {
    for (String s : lst)
    {
      if (s.equals ("foo") == true)
      { foo (); }
      if (s.equals ("bar") == true)
      { bar (); }
    }
  }
}

最佳答案

我强烈建议不要在这种情况下使用反射 - 这显然是代码异味,它破坏了代码的安全性并可能导致许多问题和缺点 - 想想如果有人将 NotSoElegant 在列表中。

当然还有methods to fetch method by name所以基本上你可以扫描类,通过字符串获取方法,处理异常......不要这样做。

基本上,拥有这样一组 ifs 并没有什么不好,但是您可以使用 switch 语句稍微重构一下

for (String s : lst) {
    switch(s) {
        case "foo": 
            foo();
            break;
        case "bar": 
            bar();
            break;
    }
}

如果你想更坚定地提示并且不违反开放-关闭规则,你应该考虑使用一些设计模式(比如 Strategy )但不要使用反射:)

关于Java:如何通过字符串内容选择/调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65915977/

相关文章:

c# - 使用 AutoMapper 对字符串的枚举描述

java - for循环内的System.arraycopy不是切换矩阵行吗?

python - 测试正在安装的 Python 模块依赖项

c# - log4net什么时候登录?

带有子类参数的Java getMethod

java - 将多个对象合并到 java.lang.Object 的单个实例中

java - 如何克服 JFreeChart 问题?

java - 从 Java 调用的 Lisp 代码

java - 有什么办法可以将 "CAST"ArrayList转成CopyOnWriteArrayList

Java 正则表达式花费的时间太长