4 回答
TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
對于 Java 7 及以下版本,我們可以為函數(shù)實現(xiàn)聲明一個接口。
對于 Java 8+,我們可以使用Function接口。
界面:
public interface FunctionExecutor {
public Object execute(String from,String to);
}
函數(shù)上下文:
public class FunctionContect {
HashMap<String, FunctionExecutor> context=new HashMap<String, FunctionExecutor>();
public void register(String name,FunctionExecutor function){
context.put(name, function);
}
public Object call(String name,String from,String to){
return context.get(name).execute(from, to);
}
public FunctionExecutor get(String name){
return context.get(name);
}
}
功能實現(xiàn):
public class RunFunctionImpl implements FunctionExecutor{
@Override
public Object execute(String from, String to) {
System.out.println("function run");
return null;
}
}
// OTHER FUCNTIONS
注冊功能:
FunctionContect contex = new FunctionContect();
contex.register("run", new RunFunctionImpl());
contex.register("walk", new WalkFunctionImpl());
contex.register("hide", new HideFunctionImpl());
調(diào)用函數(shù)
context.call(action, from, to);
或者
context.get(action).execute(from,to);
TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
擺脫 switch 的一種可能選擇是使用函數(shù)的 hashmap:
private String stringMethod(final String action, final String source) {
final Function<String, String> toLowerFunction = String::toLowerCase;
final Function<String, String> toUpperFunction = String::toUpperCase;
final HashMap<String, Function<String, String>> stringFunctions = new HashMap<>();
stringFunctions.put("toLower", toLowerFunction);
stringFunctions.put("toUpper", toUpperFunction);
return stringFunctions.get(action).apply(source);
}
TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
我不完全確定你想要實現(xiàn)什么。如果你不想繼續(xù)添加新的
case ("ccc"):
Lmn(b,c,i);
break;
塊。
您可以散列 a 中的HashMap<string, method>方法并使用鍵從映射中獲取方法并執(zhí)行它。
TA貢獻(xiàn)1877條經(jīng)驗 獲得超1個贊
如果您在同一個變量上有重復(fù)的 switch 案例,例如在 methodf和. 然后你可以把事情從里到外:gh
void f(String a) {
switch (a) {
case "aaa": ... ; break;
...
}
}
void g(String a) {
switch (a) {
case "aaa": ... ; break;
case "bbb": ... ; break;
case "ccc": ... ; break;
...
}
}
void h(String a) {
switch (a) {
case "aaa": ... ; break;
...
}
}
可以將面向?qū)ο筇幚頌椋?/p>
class C {
public f() { }
public g() { }
public h() { }
}
class Aaa extends C {
@Override
public f() { test3(b,c); } // Or even just the body of test3
@Override
public g() { }
@Override
public h() { }
}
class Bbb extends C {}
class Ccc extends C {}
然后一旦必須提供特定的 C:
C c;
switch (a) {
case "aaa": c = new Aaa(); break;
case "bbb": c = new Bbb(); break;
case "ccc": c = new Ccc(); break;
...
}
c.f(...);
c.g(...);
c.h(...);
這看起來是間接的,但實際上提高了開發(fā)質(zhì)量。添加新案例并不意味著搜索所有開關(guān)案例。
一種情況(“aaa”)的代碼都在一個類中,具有自己的專用字段。這可以簡化事情并提供更好的概覽。
添加回答
舉報
