Java 尽量减少方法中的if-else条件
我有以下课程Java 尽量减少方法中的if-else条件,java,jakarta-ee,if-statement,Java,Jakarta Ee,If Statement,我有以下课程 public enum EnumService { ONE, TWO, THREE, FOUR,.............HUNDRED; //Values till HUNDRED public static EnumService returnMockService(String request) { //some string match if(request.matches("/abc*")){
public enum EnumService
{
ONE, TWO, THREE, FOUR,.............HUNDRED;
//Values till HUNDRED
public static EnumService returnMockService(String request)
{
//some string match
if(request.matches("/abc*")){
return ONE;
}
//some other string is match
else if(request.matches("/bcd*"))
return TWO;
else if(request.matches("/decf*"))
return THREE;
//many else if conditions
else if(request.matches("/wxyz*"))
return HUNDRED;
return null;
}
}
该代码不是包含更多if-else语句的标准代码
我希望在上述方法中最小化if调用的数量,同时将返回类型保持为EnumService
有更好的选择吗
如果有人能帮我把它弄干净,那就太好了。如果没有逻辑将
/abc
映射到1和/bcd
映射到2等,那么您可能需要将它们加载到一个数组或映射中,然后简单地获取它匹配的数组的索引
myMap.put("abc", ONE);
myMap.put("bcd", TWO);
我会将要匹配的字符串与它们应该映射到的EnumService
值一起放入一个简单对象数组中,然后在数组中循环
例如:
然后:
for (ArrayEntry entry : entries) {
if (request.matches(entry.str)) {
return entry.value;
}
}
return null;
…其中,ArrayEntry
只是一个具有这两个属性的简单类(str
和value
)
如果不想使用阵列入口
,可以使用映射
:
Map<String,EnumService> entries = new HashMap<String,EnumService>();
entries.put("/abc*", EnumService.ONE);
//...and so on...
然后
for (Map.Entry<String,EnumService> entry : entries.entrySet()) {
if (request.matches(entry.getKey())) {
return entry.getValue();
}
}
return null;
int n;
for (n = 0; n < strings.length; ++n) {
if (request.matches(strings[n])) {
return values[n];
}
}
return null;
intn;
对于(n=0;n
但是并行阵列往往是一个维护问题。请查看下面的链接
如前所述,如果您使用的是jdk 7,只需在字符串上使用开关即可。如果不是,则创建一个枚举/abc*
,/bcd*
等,并在交换机中使用它们
希望这有帮助
或者,您也可以始终将它们存储在一个数组中,并在其中循环。这会容易得多,但需要额外的数组。您可以选择设计模式,最适合这种情况的是状态模式。状态模式是为了解决这类问题,并使代码更加兼容和灵活。
首先查看这一点。如果返回,则无需否则
第二:如果将此字符串用作枚举中的参数,则可以对其进行大量优化:
public enum EnumService
{
ONE("abc*"),
// etc
private static final Map<Pattern, EnumService> MAPPING
= new HashMap<>();
static {
for (final EnumService svc: values())
MAPPING.put(svc.pattern, svc);
}
private final Pattern pattern;
EnumService(final String s)
{
pattern = Pattern.compile(s);
}
public static EnumService returnMockService(String request)
{
for (final Map.Entry<Pattern, EnumService> entry: MAPPING.entrySet())
if (entry.getKey().matcher(request).matches())
return entry.getValue();
return null;
}
}
公共枚举服务
{
一个(“abc*”),
//等
私有静态最终映射
=新HashMap();
静止的{
对于(最终EnumService svc:values())
MAPPING.put(svc.pattern,svc);
}
私人最终模式;
枚举服务(最终字符串s)
{
pattern=pattern.compile;
}
公共静态枚举服务returnMockService(字符串请求)
{
对于(最终Map.Entry:MAPPING.entrySet())
if(entry.getKey().matcher(request.matches())
返回条目.getValue();
返回null;
}
}
但是将/abc映射为一的逻辑是什么?@user2310289。我只想检查某个字符串是否匹配,返回特定的枚举。这只是示例数据。没有模式可以简化。您可以删除所有else
语句,因为它们已过时,因为您的if
语句具有return
语句。@CeilingGecko即使没有return
语句,否则
是不必要的,因为所有条件都是不连续的。你之所以避开映射
,而选择了并行阵列
?@DanTemple:我唯一能想到的就是咖啡不足。:-)谢谢,我已经加上了。100的转换声明仍然会很糟糕。是的。。然后使用数组会简单得多。这里的问题(不是我的否决票)是不能使用请求。将与开关的情况匹配。当然这就是模式。该模式将意味着对枚举状态的更改,而这在这里不会发生。@OldCurmudgeon策略模式实际上是使用不同的实现来完成相同的事情。但状态模式是基于状态做不同的事情。在这里,他有不同的状态,并且基于状态他在做事情。简单一点,谢谢你的快速回复。
int n;
for (n = 0; n < strings.length; ++n) {
if (request.matches(strings[n])) {
return values[n];
}
}
return null;
public enum EnumService
{
ONE("abc*"),
// etc
private static final Map<Pattern, EnumService> MAPPING
= new HashMap<>();
static {
for (final EnumService svc: values())
MAPPING.put(svc.pattern, svc);
}
private final Pattern pattern;
EnumService(final String s)
{
pattern = Pattern.compile(s);
}
public static EnumService returnMockService(String request)
{
for (final Map.Entry<Pattern, EnumService> entry: MAPPING.entrySet())
if (entry.getKey().matcher(request).matches())
return entry.getValue();
return null;
}
}