Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尽量减少方法中的if-else条件_Java_Jakarta Ee_If Statement - Fatal编程技术网

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;
    }
}