有没有一种方法可以避免if else块中的重复方法调用?

时间:2020-06-26 14:10:44

标签: java if-statement

我想改进此代码以避免重复的方法调用。是否有解决此问题的方法?我不想每次在if else块中都调用相同的方法updateIndicator和createErrorResponse方法。

if (e.getRawStatusCode() == NOT_FOUND) {
    String errorDetails = createNotFoundDetails(transactionId);
    updateIdentifier(identifier);
    return createErrorResponse(MISSING_VALID_TRANSACTION_ID_ERROR_MSG, errorDetails);
}
else if (e.getRawStatusCode() == UNAUTHORIZED) {
    updateIdentifier(identifier);
    if (responseHeaderValue.equals(TOKEN_EXPIRED) ) {
        return createErrorResponse(UNABLE_TO_REACH_SVC_PROVIDER_ERROR_MSG,
                                   INVALID_RESPONSE_FROM_SVC_PROVIDER_EXPIRED_TOKEN_ERROR_DETAILS);
    }
    return createErrorResponse(UNABLE_TO_REACH_SVC_PROVIDER_ERROR_MSG,
                               INVALID_RESPONSE_FROM_SVC_PROVIDER_INVALID_TOKEN_ERROR_DETAILS);
}
else {
    updateIdentifier(identifier);
    return createErrorResponse(UNABLE_TO_REACH_SVC_PROVIDER,
                               UNABLE_TO_REACH_SVC_PROVIDER_ERROR_DETAILS);
}

2 个答案:

答案 0 :(得分:0)

您可以在该类中创建一个公共静态方法。例如

public static errorResponse method(identifier) {
    updateIdentifier(identifier);
    return createErrorResponse(
    UNABLE_TO_REACH_SVC_PROVIDER, UNABLE_TO_REACH_SVC_PROVIDER_ERROR_DETAILS);
}

在代码中,您将调用方法。

答案 1 :(得分:0)

首先,可以在if else块中提取updateIdentifier(identifier);语句,因为它在每个分支中都执行。

然后您的代码将在每个分支内使用if else逻辑和单个调用createErrorResponse(...)方法。考虑到必须检查的不同条件,这不是一个糟糕的代码。无论如何,如果您需要进一步减少,可以采取不同的方法。请注意,这将减少此处的代码,但会将更多代码添加到其他地方。也许还有几节课。

我已经使用Enums实现了一个示例,目的是让您了解您可以做什么。

public enum Error
{
    ERROR1TEST
            {
                @Override
                ErrorResponse createErrorResponse()
                {
                    return new ErrorResponse( "First Error" );
                }
            },
    ERROR2TEST2
            {
                @Override
                ErrorResponse createErrorResponse()
                {
                    return new ErrorResponse( "Second Error" );
                }
            },
    ERROR3
            {
                @Override
                ErrorResponse createErrorResponse()
                {
                    return new ErrorResponse( "Third Error" );
                }
            },
    ;

    abstract ErrorResponse createErrorResponse();
}

现在,根据您的e.getRawStatusCode()responseHeaderValue,我们需要在Enum Constant名称上方创建。在每个枚举常量中,我们都有一种方法可以为每种情况构建错误响应。

    public static void main( String[] args )
    {
        CustomEvent e = new CustomEvent();
        e.setEvent( 1 );
        String headerValue = "TEST";

        ErrorResponse errorResponse = createErrorResponse( e, headerValue );
        System.out.println( errorResponse );
    }

    private static ErrorResponse createErrorResponse( CustomEvent e, String headerValue )
    {
        String name = "ERROR" + e.getRawStatusCode() + headerValue;
        return Error.valueOf( name ).createErrorResponse();
    }

输出:ErrorResponse{errorMsg='First Error'}

使用此方法,您可以将代码缩减为类似的内容

updateIdentifier(identifier);
return createErrorResponse(e.getRawStatusCode(),responseHeaderValue );

请注意,这只是一个示范。您可能需要进行相应的调整。如果期望未定义状态,则处理在调用No enum constant Error时引发的Error.valueOf( name )。 使用的其他课程

public class ErrorResponse
{
    String errorMsg;

    public ErrorResponse( String errorMsg )
    {
        this.errorMsg = errorMsg;
    }

    @Override public String toString()
    {
        return "ErrorResponse{" +
                "errorMsg='" + errorMsg + '\'' +
                '}';
    }
}


public class CustomEvent
{
    private int event;

    public int getEvent()
    {
        return event;
    }

    public void setEvent( int event )
    {
        this.event = event;
    }

    public int getRawStatusCode()
    {
        return this.event;
    }
}