有没有办法通过注释预定义数组参数的长度

时间:2018-05-01 19:10:33

标签: java arrays annotations

我正在处理数独求解应用程序,我不想编写代码,例如

Method(int[] i)
{
   if(i.length == 9)
      {
      // do stuff
      }
   else
      {
      // throw...
      }
}

有没有办法通过使用注释(如

)将数组参数强制为精确的9整数
Method(@SizeNine int[] i)
    {
       //do stuff
    }

2 个答案:

答案 0 :(得分:1)

您无法在数组上强制执行(长度不是Java中数组类型的一部分,与其他语言不同)。

但是,您可以定义这样的类:

final class IntArrayWithLength9 {  // Obv you can use a better name.
  private final int[] arr = new int[9];

  void set(int i, int value) { arr[i] = value; }
  int get(int i) { return arr[i]; }
}

现在,您知道如果您有这个类的实例,那么该数组的长度为9,因此您无需检查它。

因此,您现在可以使用IntArrayWithLength9代替int[]

答案 1 :(得分:0)

是的,这是可能的,使用编译器插件。

使用@ArrayLen注释声明一个方法,其参数必须是长度为9的字符串数组:

void myMethod(String @ArrayLen(9) [] a) {
  ...
}

然后,使用Index CheckerChecker Framework编译您的程序:

javac -processor index MyJavaFile.java

现在,如果任何客户端尝试传递长度不能保证为9的数组,javac将发出编译时警告。如果有警告,您可以修复它并重新编译。无需在实现中对数组长度执行运行时检查。