sprawdzanie czy pola obiektu not null

Odpowiedz Nowy wątek
2014-10-05 12:43

Rejestracja: 6 lat temu

Ostatnio: 2 dni temu

Lokalizacja: Warszawa

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));
    }
}

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!

Pozostało 580 znaków

2014-10-05 12:52

Rejestracja: 5 lat temu

Ostatnio: 4 dni temu

1

Pewnie Refleksją

w jaki sposób? - karolinaa 2014-10-05 13:19
@Szczery tak wgl ta lista <Object> i .contains(null); jest okey czy to raczej wtf? - karolinaa 2014-10-05 13:30
Refleksja i tak bedzie trzeba bedzie zrobic field.get(object). - miszasty93 2014-10-05 13:36
@karolinaa dlaczego trzymasz null'e w collekcji ? czytałaś o głavie a tam dość jasno piszą zeby tego nie robić, dostajesz nulla to znaczy że nic nie ma = proste. - niezdecydowany 2014-10-05 15:19

Pozostało 580 znaków

2014-10-05 13:38

Rejestracja: 5 lat temu

Ostatnio: 4 dni temu

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

Pozostało 580 znaków

2014-10-05 15:11

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

Lokalizacja: Bieszczady

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.

"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
edytowany 1x, ostatnio: niezdecydowany, 2014-10-05 15:17

Pozostało 580 znaków

2014-10-05 15:30

Rejestracja: 7 lat temu

Ostatnio: 3 tygodnie temu

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
}
2014-10-05 15:48

Rejestracja: 12 lat temu

Ostatnio: 2 dni temu

2

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

edytowany 1x, ostatnio: Koziołek, 2014-10-05 15:48
aczkolwiek warto się zastanowić gdzie ta validacja ma być wklejana, bo jak np: to ma być validowanie danych od użytkownika to i tak trzeba validować najpierw te dane. - @Koziołek widzę ze chyba zmieniłeś kolor czcionki ? - niezdecydowany 2014-10-05 16:31
Walidacja danych od użytkownika może zostać zrobiona za pomocą np. Preconditions.checkArgument(dataValidator.isValid(fromUser)); w takim wypadku umieszczasz to w konstruktorze czy też setterze. - Koziołek 2014-10-05 16:56
hmm, ok, ale czy nie ma jakieś konwencji w springu że widoki oczekują obiektu BingingResult ? - niezdecydowany 2014-10-05 17:30
W springu w ogóle jest BeanValidation i ładny mechanizm z AOPem do tego. - Koziołek 2014-10-05 18:09
fuck-tycznie :D - niezdecydowany 2014-10-05 18:16

Pozostało 580 znaków

2014-10-05 21:45

Rejestracja: 6 lat temu

Ostatnio: 2 dni temu

Lokalizacja: Warszawa

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;
    }
}

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
niepotrzebnie field.setAccessible(true); bo nie zmieniasz wartości pola. - Koziołek 2014-10-06 07:36
nie wiem wtedy czemu dostaję Exception in thread &quot;main&quot; java.lang.IllegalAccessException: Class appka.NullFields can not access a member of class appka.User with modifiers &quot;private&quot; - karolinaa 2014-10-06 08:09

Pozostało 580 znaków

2014-10-06 08:13

Rejestracja: 7 lat temu

Ostatnio: 2 dni temu

0

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

Pozostało 580 znaków

2014-10-06 14:40

Rejestracja: 8 lat temu

Ostatnio: 1 rok temu

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

edytowany 1x, ostatnio: ShermanMg, 2014-10-06 14:40
no tak ale generujesz wyjątek tylko w momencie jeżeli jest nullem, przy normalnym korzystaniu nie. Ale rozumiem o co kaman - wojciechmaciejewski 2014-10-06 14:47
to zwykłe assert - javove - niezdecydowany 2014-10-06 15:00
assert a assertNotNull to różnica, zresztą na produkcji nie korzysta się z asercji - ShermanMg 2014-10-06 15:32
pewnie że nie - ale takowa assercja jest - i można nią sprawdzić walidacje na nullach. - niezdecydowany 2014-10-06 15:53
i potem będziesz łapał Errory ? A co jak poleci OutOfMemoryError ? - ShermanMg 2014-10-06 16:00
jak poleci OutOfMemoryError to poleci OutOfMemoryError - niezdecydowany 2014-10-06 17:23

Pozostało 580 znaków

2014-10-06 19:35

Rejestracja: 12 lat temu

Ostatnio: 2 dni temu

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.

czyli aż na tak głupi pomysł nie wpadłem, zawsze to miło :P - wojciechmaciejewski 2014-10-06 20:14

Pozostało 580 znaków

Odpowiedz

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