03
Июл
2016

Правильная обработка null в большой вложенности данных

Здравствуйте! К примеру, необходимо загрузить JSON с сервера и отобразить некоторые поля в UI. Но порой, вложенность данных очень большая и один объект может содержать кучу других вложенных объектов, которые в свою очередь - тоже содержат такие же вложенные объекты. И есть вероятность, что порой из-за багов на сервере могут некоторые поля содержать null.

Если писать логику получения и отображения данных для Java модели на основе JSON, то из-за большой вложенности данных код начинает засоряться проверками на null, а так же если необходимо повесить дополнительную логику на обработку данных, то все становится еще плачевнее в плане читаемости.

Я создал небольшой пример (Выдуманный) и постарался разделить на отдельные методы логику по получению данных из модели и их отображению. Подскажите, пожалуйста, правильно ли я поступаю?? Или же необходимо выкидывать исключения, если данные пришли, например, невалидные или же необходимый объект == null.

Предполагается что в реальных задачах модель Job может содержать гораздо больше данных.

Заранее спасибо, за вашу помощь.

public class Main {
static class Job {
    private int id;
    private List<Shipment> shipments;
    private Driver driver;
    private Truck truck;

    /* Предположим, что тут конструктор, а так же геттеры и сеттеры */
}

static class Shipment {
    private int id;
    private String goods;
    private Address address;

    /* Предположим что тут конструктор, а так же геттеры и сеттеры */
}

static class Address {
    private int id;
    private String city;

    /* Предположим что тут конструктор, а так же геттеры и сеттеры */
}

static class Driver {
    private int id;
    private String firstName;
    private String lastName;

    /* Предположим что тут конструктор, а так же геттеры и сеттеры */
}

static class Truck {
    private int id;
    private String number;

    /* Предположим что тут конструктор, а так же геттеры и сеттеры */
}

public static void main(String[] args) {
    Job job = load();
    updateUI(job);
}

/**
 * Эмулирует заргузку модели Job
 * @return Job
 */
static Job load() {
    Driver driver = new Driver(1, "John", "Kristoff");
    Truck truck = new Truck(1, "NV157");
    Address address = new Address(1, "New York");
    Shipment shipment = new Shipment(1, "Coffee", address);

    List<Shipment> shipments = Collections.singletonList(shipment);
    return new Job(1, shipments, driver, truck);
}

static void updateUI(Job job) {
    if (job == null) {
        return;
    }

    showShipments(job.getShipments());
    showDriver(job.getDriver());
    showTruck(job.getTruck());
}

static void showShipments(List<Shipment> shipments) {
    if (shipments == null) {
        return;
    }

    for (Shipment shipment: shipments) {
        System.out.println("Goods in the shipment: " + shipment.getGoods());

        if (shipment.getAddress() != null) {
            System.out.println("Shipment`s address: " + shipment.getAddress().getCity());
        }
    }
}

static void showDriver(Driver driver) {
    if (driver == null) {
        return;
    }

    System.out.println("Driver`s first name: " + driver.getFirstName());
    System.out.println("Driver`s last name: " + driver.getLastName());
}

static void showTruck(Truck truck) {
    if (truck == null) {
        return;
    }

    System.out.println("Truck: " + truck.getNumber());
}

}

Источник: https://ru.stackoverflow.com/questions/540867/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-null-%D0%B2-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9-%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

Share

Тебе может это понравится...