Currently, OptionalProperty has the following constructors:
public OptionalProperty(@NotNull Property<T> baseProperty) {
this.baseProperty = baseProperty;
this.defaultValue = Optional.empty();
}
public OptionalProperty(@NotNull Property<T> baseProperty, @NotNull T defaultValue) {
this.baseProperty = baseProperty;
this.defaultValue = Optional.of(defaultValue);
}
In ConfigMe 2.0, we want to make property types more prominent because they can be combined more easily. Thus, the following constructor would be desirable:
public OptionalProperty(@NotNull String path, @NotNull PropertyType<T> propertyType,
@NotNull T defaultValue) {
this.baseProperty = new TypeBasedProperty<>(path, propertyType, defaultValue);
this.defaultValue = Optional.of(defaultValue);
}
^ This constructor, however, forces that a default value be provided. What if the user wants Optional.empty to be the default? We need a default value in order to construct the TypeBasedProperty.
To do
Goal of this issue is to revise the implementation of OptionalProperty:
- Change
OptionalProperty to have a constructor like above, as well as a constructor without the defaultValue param
- In order to achieve this, the field
baseProperty must be replaced by a PropertyType field and a nullable defaultValue field
- Adapt usages in
PropertyInitializer to no longer have the fake default value (very nice change!)
- Breaking change: OptionalProperty supports only property types; you cannot wrap any arbitrary BaseProperty anymore.
In order to maintain compatibility with a "base Property", introduce some way to still be able to create an OptionalProperty based on another Property<?>. We cannot assume that it has a PropertyType that we can extract from it.
Probably introduce some extension of OptionalProperty that overrides all the necessary behavior. This will be ugly (because some fields in the parent will be unused) but this will maintain backwards compatibility for those who wish.
With some static method on OptionalProperty we could even hide the fact that an extension is at play.
Currently,
OptionalPropertyhas the following constructors:In ConfigMe 2.0, we want to make property types more prominent because they can be combined more easily. Thus, the following constructor would be desirable:
^ This constructor, however, forces that a default value be provided. What if the user wants
Optional.emptyto be the default? We need a default value in order to construct theTypeBasedProperty.To do
Goal of this issue is to revise the implementation of OptionalProperty:
OptionalPropertyto have a constructor like above, as well as a constructor without thedefaultValueparambasePropertymust be replaced by aPropertyTypefield and a nullabledefaultValuefieldPropertyInitializerto no longer have the fake default value (very nice change!)In order to maintain compatibility with a "base Property", introduce some way to still be able to create anOptionalPropertybased on anotherProperty<?>. We cannot assume that it has aPropertyTypethat we can extract from it.Probably introduce some extension ofOptionalPropertythat overrides all the necessary behavior. This will be ugly (because some fields in the parent will be unused) but this will maintain backwards compatibility for those who wish.With some static method onOptionalPropertywe could even hide the fact that an extension is at play.