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

chr*_*s01 2 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 (); }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

m.a*_*icz 5

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

当然有方法可以按名称获取方法,所以基本上你可以扫描类,按字符串获取方法,处理异常......不要这样做。

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

for (String s : lst) {
    switch(s) {
        case "foo": 
            foo();
            break;
        case "bar": 
            bar();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想更加 SOLID 抱怨并且不打破Open-Closed规则,你应该考虑使用一些设计模式(如Strategy)但不要使用反射:)