gpt4 book ai didi

java - 如何压缩大型 switch 语句

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:29 28 4
gpt4 key购买 nike

我有一个大开关,如下所示:

public int procList(int prov, ArrayList<TXValue> txValueList, Context context)
{
switch(prov)
{
case Foo.PROV_ONE:
return proc_one(txValueList, context);

case Foo.PROV_NOE:
return proc_noe(txValueList, context);

case Foo.PROV_BAR:
return proc_bar(txValueList, context);

case Foo.PROV_CABAR:
return proc_cabar(txValueList, context);

case Foo.PROV_FAR:
return proc_far(txValueList, context);

case Foo.PROV_TAR:
return proc_tar(txValueList, context);

case Foo.PROV_LBI:
return 408;

default:
return -1;
}
}

在 C++ 中我可以使用 std::map<Foo, some_function_ptr>并按以下方式使用它:

map[prov](txValueList, context); 

Java 中没有指向函数的指针。但是,它使用抽象类,就像在 the answer 中一样。 .那么,有没有最好的方法来消除巨大的 switch Java 中的子句?

最佳答案

您正在寻找的是一个枚举。

public enum Prov {
PROV_ONE(Foo.PROV_ONE) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_one(txValueList, context);
}
},
PROV_NOE(Foo.PROV_NOE) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_noe(txValueList, context);
}
},
PROV_BAR(Foo.PROV_BAR) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_bar(txValueList, context);
}
},
PROV_CABAR(Foo.PROV_CABAR) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_cabar(txValueList, context);
}
},
PROV_FAR(Foo.PROV_FAR) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_far(txValueList, context);
}
},
PROV_TAR(Foo.PROV_TAR) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return proc_tar(txValueList, context);
}
},
PROV_LBI(Foo.PROV_LBI) {
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return 408;
}
},
UNKNOWN(Integer.MIN_VALUE) { // make sure this is not used in other IDs
//decide if you actually need this
@Override
public int provMethod(List<TXValue> txValueList, Context context) {
return -1;
}
};

private int id;

private Prov(int id) {
this.id = id;
}

public abstract int provMethod(List<TXValue> txValueList, Context context);

public static Prov getById(int id) {
for(Prov prov : Prov.values()) {
if(id == prov.id) {
return prov;
}
}
//return null;
//throw new IllegalArgumentException("Specified id was not found.");
return Prov.UNKNOWN;
}
}

然后你可以做

public int procList(int prov, ArrayList<TXValue> txValueList, Context context)
{
return Prov.getById(prov).provMethod(txValueList, context);
}

关于java - 如何压缩大型 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com