У меня есть класс конфигурации 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
...
}
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 arg, поскольку он был в вашем коде - удалите его, если нет логического смысла предоставлять его.
Большое спасибо - сработало нормально. Можете ли вы сказать мне, чего позволяет конструктор no args? Не могу понять его функции.