Конфигурация Spring - необязательное поле Arraylist

У меня есть класс конфигурации Spring, содержащий встроенный список. Объект содержит спецификацию плоского файла с разделителями.

Я хочу иметь дополнительные поля для точности и масштаба в классе SchemaAttributes для экземпляров, где тип - decimalType. Эти поля не имеют отношения к любому другому типу данных.

Как реализовать значение по умолчанию для экземпляров, в которых не указаны значения точности / масштабов?

@ConfigurationProperties(prefix = "source-parameters.file_schema")
@Configuration
public class FileSchema {

private List<SchemaAttributes> schema;

public FileSchema(List<SchemaAttributes> schema) {
    this.schema = schema;
}

public FileSchema(){

}

public List<SchemaAttributes> getSchema() {
    return schema;
}

public void setSchema(List<SchemaAttributes> schema) {
    this.schema = schema;
}


public static class SchemaAttributes {

    private String name;
    private String type;
    private Boolean nullable;
    private int precision;
    private int scale;

    public SchemaAttributes(String name, String type, Boolean nullable) {
        this.name = name;
        this.type = type;
        this.nullable = nullable;
        this.precision = precision;
        this.scale = scale;
    }

    public SchemaAttributes() {
    }

    // getters, setters

  ...
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

precision и scale являются примитивными int, поэтому, если конструктор не предоставляет значение, precision и scale будут инициализированы значением 0. Например:

public SchemaAttributes(String name, String type, Boolean nullable) {
    this.name = name;
    this.type = type;
    this.nullable = nullable;
    //this.precision = precision;  this.precision will be initialized to 0
    //this.scale = scale;  this.scale will be initialized to 0
}

Но обычно делегируют другому конструктору, который принимает больше аргументов. Например:

public SchemaAttributes(String name, String type, Boolean nullable, int preciesion, int scale) {
    this.name = name;
    this.type = type;
    this.nullable = nullable;
    this.precision = precision;
    this.scale = scale;
}

public SchemaAttributes(String name, String type, Boolean nullable) {
    this(name, type, nullable, 0, 0);
}

public SchemaAttributes() {
    this("unknown", "unknown", true);
}

Иногда количество аргументов становится слишком большим и / или количество конструкторов становится слишком большим. Если создание экземпляра становится трудным / громоздким, подумайте о переходе на шаблон Builder.

Большое спасибо - сработало нормально. Можете ли вы сказать мне, чего позволяет конструктор no args? Не могу понять его функции.

Chris Finlayson 14.09.2018 21:05

Я включил конструктор no arg, поскольку он был в вашем коде - удалите его, если нет логического смысла предоставлять его.

Andrew S 14.09.2018 21:21

Другие вопросы по теме