我有一个列表和函数。
我想迭代列表并调用匹配列表元素的函数。 我怎样才能以比在 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/