我有一个列表,我有功能。
我想迭代列表并调用与列表元素匹配的函数。我怎样才能以比在 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)
我强烈建议不要在这种情况下使用反射 - 这显然是代码异味,它破坏了代码的安全性,并可能导致许多问题和缺点 - 想想如果有人将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)但不要使用反射:)