Как этот код Java выполняет код? - PullRequest
4 голосов
/ 24 февраля 2010

У меня есть проект в моем классе программирования, и я провалю тестовый пример. Я смотрю в тестовый драйвер и нахожу это:

 private static boolean testSquareArch()
  {
  boolean pass = true;
  int test = 1;
  int cnt;
  Square sq;
  Class cl;

  System.out.println("Square architecture tests...");

  sq = new Square(true, true, true, true, 0, 0);

  cl = sq.getClass();
  cnt = cl.getFields().length;
  pass &= test(cnt == 5, test++);  //FAILING THIS TEST

Что это делает и как проверяет мой код?

Кроме того, пока я здесь, что это делает?

  // Count and test number of of PACKAGE fields
  cnt = cl.getDeclaredFields().length
      - countModifiers(cl.getDeclaredFields(), Modifier.PRIVATE)
      - countModifiers(cl.getDeclaredFields(), Modifier.PROTECTED)
      - countModifiers(cl.getDeclaredFields(), Modifier.PUBLIC);
  pass &= test(cnt == 5, test++);  // Test 8 

Я провалю эти тестовые случаи и просто хочу знать, почему. Спасибо

Ответы [ 5 ]

3 голосов
/ 24 февраля 2010

Если вы спрашиваете об операторе присваивания &=, он сохраняет переменную true, только если правый аргумент также равен true (если он уже был ложным, он останется ложным). Он работает так же, как += и a &= b - это то же самое, что и a = a & b, оператор & является логическим соединением (AND).

 pass &= test(cnt == 5, test++); 

является сокращением для

 if( ! test( cnt == 5, test ) )
     pass = false;
 test++;

Я предполагаю, что он является частью кода модульного тестирования, и утверждает, что cnt == 5, также считая количество тестов и общий результат (успешно или неудачно).

Используя Junit, вам не нужно вручную следить за количеством тестов или конечным результатом, и вы можете написать

assertEquals("count is correct", 5, cnt);

Это также даст полезный вывод, который поможет выяснить, что именно не удалось (например, значение неправильного счета).

1 голос
/ 24 февраля 2010

Если вас интересует &=, вот цитата из JLS 15.22.2. Логические логические операторы &, ^ и | .

Для & значение результата равно true, если оба значения операнда имеют значение true; в противном случае результат будет ложным.

Операторы & и | для логических значений являются менее известными двоюродными братьями && ( 15.23 ) и || ( 15,24 ). Последние два являются «условными» операторами; они закорачивают и оценивают только правую сторону, если это действительно необходимо.

Оператор && похож на & (§15.22.2), но оценивает его правый операнд, только если значение его левого операнда равно true.

&= - версия составного присвоения &. См. JLS 15.26.2. Составные операторы присваивания .

Составное выражение присваивания в форме E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - это тип E1, за исключением того, что E1 оценивается только один раз.

Другими словами, они эквивалентны (предполагается boolean b):

b &= bool_expr;
b = b & bool_expr;
if (!bool_expr) b = false;

Это также может быть вашей проблемой ( java.lang.Class # getDeclaredFields ):

Возвращает массив объектов Field, отражающих все поля, объявленные классом или интерфейсом, представленным этим объектом Class. Сюда входят открытые, защищенные, доступ по умолчанию (пакет) и закрытые поля, , но исключаются унаследованные поля .

Ваш счет может быть неправильным, если вы хотите также подсчитать унаследованные поля.

1 голос
/ 24 февраля 2010

Похоже, что он проверяет, сколько полей вы объявили в своем классе, и сколько из них являются частными.

0 голосов
/ 24 февраля 2010

Да, кажется, для выполнения оператора требуется еще несколько полей. Это должно исправить пространство имен.

0 голосов
/ 24 февраля 2010

В Java пространства имен для переменных и методов не конфликтуют. Таким образом, похоже, что у драйвера есть и переменная, и метод с именем «test».

Без метода test () и вашего собственного исходного кода трудно сказать, что не так, но похоже, что у вас неправильное количество полей в вашем классе Square. (Должно быть пять.)

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