sprawdzanie czy pola obiektu not null

0

Hej. Mam klasę z wieloma polami i muszę sprawdzić wszystkie / część z nich czy nie są nullami. Wcześniej sprawdzałam ifami, ale teraz pomyślałam, żeby napisać coś takiego. Mam pytanie czy da się może robić to lepiej / otrzymać nazwę pola, które jest nullem (chciałabym rzucać wyjątkiem z odpowiednim komunikatem).

import com.google.common.collect.Lists;

import java.util.Date;
import java.util.List;

class User {
    private Long id;
    private String name;
    private Date created;

    User(Long id, String name, Date created) {
        this.id = id;
        this.name = name;
        this.created = created;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Date getCreated() {
        return created;
    }
}

class UserValidator {
    public static boolean check(User user) {
        List<Object> refs = Lists.newArrayList(
                user.getId(),
                user.getName()
        );
        return !refs.contains(null);
    }
}

public class Main {
    public static void main(String[] args) {
        User user = new User(null, null, null);
        System.out.println(UserValidator.check(user));
        user = new User(1L, "aaaa", null);
        System.out.println(UserValidator.check(user));
    }
}
1

Pewnie Refleksją

1

Albo sobie zrobisz to reflesą ida po polach i sprawdzając ich wartości..wtedy też masz nazwy tych pól tak działa BeanValidation

1
  1. Po co to robisz ? bo według mnie to trochę ... za bardzo ten teges.
  2. Jeżeli te pola przyjmujesz formatką - i jest to spring - to robisz na tym @NOTNULL i masz @Valid w controlerze.
2

Czemu nie zrobisz tak (bardziej jako pseudokod bo pisane z palca):

final class NotNullable<A> {
  private final A underlying;
  public A value() { return underlying; }

  private NotNullable(A a) {
     underlying = a;
  }
  
  public static <AA> NotNullable<AA> from(AA a) {
    if(a == null) throw new CosTamException();
    else return new NotNullable<AA>(a);
  }
}

final class User {
  private NotNullable<String> name;
  // reszta
}
2

Guava, Preconditions, http://koziolekweb.pl/2014/01/02/zastepujemy-czesto-uzywane-idiomy-z-google-guava/ chyba prościej już się nie da. No i do tego Optional

0

Dzięki, niestety i tak z większości tych rzeczy (mechanizmy springa) nie mogę skorzystać ;\ , ale przyda mi się to na przyszłość.

jeżeli chodzi o refleksję, chyba tak:

class NullFields {
    public static Set<String> get(Object obj, String... fields) throws NoSuchFieldException, IllegalAccessException {
        Set<String> nullFields = new HashSet<>();
        for (String fName : fields) {
            Field field = obj.getClass().getDeclaredField(fName);
            field.setAccessible(true);
            if (field.get(obj) == null) {
                nullFields.add(fName);
            }
        }
        return nullFields;
    }
}
0

a nie możesz wpisać assertNotNull w klasie User i łapać takiego wyjątku? to tylko taki mój pomysł :)

0
wojciechmaciejewski napisał(a):

a nie możesz wpisać assertNotNull w klasie User i łapać takiego wyjątku? to tylko taki mój pomysł :)

generowanie wyjątku jest bardziej zasobochłonne niż sprawdzenie if-em Poza tym dodawanie zależności do JUnita w kodzie produkcyjnym to zła podejście do tematu

0

@ShermanMg, ale tu nie chodzi o samego Ifa/wyjątek, ob to czy wyjątek zostanie rzucony zależy od przyjętej strategii obsługi zdarzenia "jeżeli null". Można wstawić wartość domyślną, a można walnąć wyjątkiem.

Co do użycia assertNotNull z np. biblioteki fest-assert, to nie jest to złe rozwiązanie. Asercje tego rodzaju mają fajne API, są całkiem dobrze przemyślane i potrafią dość dużo w porównaniu do np. Preconditions. To, że ktoś wymyślił to do testów nie oznacza, że należy rezygnować z użycia.
Co innego assert, które jest zazwyczaj wyłączone na produkcji i to nie dlatego, że są "złe, powolne i nieprzydatne", ale dlatego że zostały wymyślone w zupełnie innym celu niż walidacja parametrów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1