Есть ли способ предопределить длину параметра массива аннотациями - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над приложением для решения судоку и не хочу писать такой код, как

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

есть ли способ заставить параметр массива быть точным 9 целым числом, используя аннотации, такие как

Method(@SizeNine int[] i)
    {
       //do stuff
    }

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Да, это возможно, используя плагин компилятора.

Используйте аннотацию @ArrayLen для объявления метода, аргумент которого должен быть массивом String длины-9:

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

Затем скомпилируйте вашу программу, используя Index Checker Checker Framework :

javac -processor index MyJavaFile.java

Теперь javac выдаст предупреждение во время компиляции, если какой-либо клиент попытается передать массив, длина которого не гарантируется равной 9. Если есть предупреждение, вы можете исправить его и перекомпилировать. Нет необходимости выполнять проверку длины массива в вашей реализации во время выполнения.

0 голосов
/ 01 мая 2018

Вы не можете применить его к массиву (длина не является частью типа массива в 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[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...