Dobre praktyki programistyczne

Zwięzły kod Java

22.04.2012

Oto przykład jak zwięzły może być kod Java. Napisałem dwie metody, które robią to samo, ale wyglądają inaczej. Sprawdzają one, czy obiekt Iterable ma tylko 1 obiekt, który dodatkowo jest równy drugiemu argumentowi. Obie metody używają klasy Objects dodanej w Javie 7. Pierwsza metoda używa operatora „&&”, który oblicza wyrażenie po prawej stronie tylko wtedy, gdy po lewej było true.

  1. static <E> boolean containsOnlyOne(Iterable<E> iterable, E object) {
  2. Iterator<E> it;
  3. return (iterable != null) && (it = iterable.iterator()).hasNext() &&
  4. Objects.equals(it.next(), object) && !it.hasNext();
  5. }

Spójrz nafragment (it = iterable.iterator()).hasNext(). Wynik metody iterator() jest przypisywany do zmiennej it, która jest następnie użyta do wywołania hasNext() na tym obiekcie. Poniżej jest równoważna metoda, która pozwoli lepiej zrozumieć działanie kodu.

  1. static <E> boolean containsOnlyOneLongVersion(Iterable<E> iterable, E object) {
  2. if (iterable == null) {
  3. return false;
  4. }
  5. Iterator<E> it = iterable.iterator();
  6. if (it.hasNext()) {
  7. E next = it.next();
  8. if (!it.hasNext()) {
  9. return Objects.equals(next, object);
  10. }
  11. }
  12. return false;
  13. }

Obie metody przechodzą poniższy test:

  1. @Test
  2. public void testContainsOnlyOne() {
  3. assertTrue(containsOnlyOne(Collections.singleton("any"), "any"));
  4. assertTrue(containsOnlyOne(Collections.singleton(null), null));
  5. assertTrue(containsOnlyOne(Collections.singletonList(537.82), 537.82));
  6. assertFalse(containsOnlyOne(Arrays.asList("one", "two"), "one"));
  7. assertFalse(containsOnlyOne(Collections.emptySet(), "none"));
  8. assertFalse(containsOnlyOne(Collections.emptySet(), null));
  9. assertFalse(containsOnlyOne(Collections.singletonList("some"), "other"));
  10. assertFalse(containsOnlyOne(Collections.singleton(1471092), 293875));
  11. assertFalse(containsOnlyOne(null, null));
  12. assertFalse(containsOnlyOne(null, 1383));
  13. }

Leave a Response