2

在 Python 中,您可以:

if error_code in (1213,1205,1317,2006,2013):
    ...

如何在 Java 中简洁地进行相同类型的检查——查看 int 是否是众多选择之一?

更新:我采用的解决方案:

private static final Set<Integer> MySQLRetryCodes = 
    Collections.unmodifiableSet(new HashSet<Integer>(
         Arrays.asList(
            1205, // lock timeout
            1213, // deadlock
            1317,2006,2013 // variations on losing connection to server
         )));

然后:

if(MySQLRetryCodes.contains(sqlError.getErrorCode()) {
    ...
4

6 回答 6

3

常量将在一个列表中,您将使用contains()如下方法:

if (Arrays.asList(1213,1205,1317,2006,2013).contains(error_code)) {
    ...
}

最好的方法是在某处将该列表声明为常量并使用它,如下所示:

public static final List<Integer> ERROR_CODES = 
    Arrays.asList(1213,1205,1317,2006,2013);

...
if (ERROR_CODES.contains(error_code)) {
    ...
}
于 2012-10-19T07:03:59.700 回答
1

我会使用 HashSet :

  if (new HashSet<Integer>
          (Arrays.asList(1213,1205,1317,2006,2013)).contains(error_code)){

       //do something

   }
于 2012-10-19T07:11:48.267 回答
1

编写ArrayList错误代码确实是bad designAnd populate it just to check whether error code is present is nightmare.

您应该考虑用Enums替换您的整数。

您可以将错误代码定义为枚举,每个常量将保存错误代码的 int 常量值。

enum ErrorCode {
    ERROR_213(213), ERROR_1205(1205), ERROR_1317(1317), ERROR_2006(2006), ERROR_DEFAULT(
            1);

    private int errorcode;

    private ErrorCode(int errorcode) {
        this.errorcode = errorcode;
    }

    public static ErrorCode valueOf(int errorcode) {

        for (ErrorCode error : ErrorCode.values()) {
            if (error.getErrorCode() == errorcode)
                return error;
        }
        return ErrorCode.ERROR_DEFAULT;
    }

    public int getErrorCode() {
        return errorcode;
    }
}

现在,如果您想随时将int价值转换为,enum那么您可以执行以下操作

ErrorCode errorcode = ErrorCode.valueOf(213);
于 2012-10-19T07:16:14.443 回答
0

将它们添加到ArrayList并使用该contains方法。

ArrayList<Integer> errorList = new ArrayList<Integer>();
        errorList.add(1213);
        errorList.add(1205);
        errorList.add(1317);
    if(errorList.contains(error_code)))
       {
         //code
       }
于 2012-10-19T07:03:54.087 回答
0

我现在有一个类似的问题,阅读这个问题的答案后,我在 Java 中遇到了下一个解决方案 9 次:

private static int CODE_IMAGE = 0;
private static int CODE_FILE  = 5;
private static final Set<Integer> CurrentCloudItemTypes = Set.of(CODE_IMAGE, CODE_FILE);

然后:

  protected boolean hasCorrectType(CloudImage image) {
    return CurrentCloudItemTypes.contains(image.getType());
  }

谢谢你的想法,它们对我很有帮助。

于 2018-06-27T15:17:32.813 回答
0

只需使用以下的返回值:

Arrays.asList(1213, 1205, 1317, 2006, 2013).contains(error_code)

或者如果你有Apache Commons Lang 库,你最好使用它的返回值:

ArrayUtils.contains(USE_CASE_1, error_code)

其中USE_CASE_1被定义为常量数组:

private static final int[] USE_CASE_1 = {1213, 1205, 1317, 2006, 2013};

这是与上面的 Python 代码最简单且非常有效的等价物,您可以在其中对一小组指定值的变量进行非频繁检查。你真的不需要在每次想要做这个检查时都创建一个新的 Set,因为它是一种低效的资源浪费。只有当它是一个静态的 final 字段(即常量)并且只有在非常频繁的检查的情况下,制作一小组检查值才有意义。error_code

另一种解决方案是使用这样的 switch 语句:

switch (error_code) {
    case 1213:
    case 1205:
    case 1317:
    case 2006:
    case 2013: {
        // do something
    }
}

它并不优雅,但即使对于对一小组指定值的非常频繁的检查,它也是最有效的。在这种情况下,它甚至比常量 Set 更有效。

于 2018-09-03T23:34:57.037 回答