public final class ConstructionDocumentation extends Object
new
operator.
Simple objects with few optional parameters typically have a static method called of
to create an object.
For example use LocalizedString.of(java.util.Locale, String, java.util.Locale, String)
to create a translation for different locales:
final LocalizedString dogFood = LocalizedString. of(Locale.ENGLISH, "dog food", Locale.GERMAN, "Hundefutter");
See the test code.
The of
method is inspired by Optional.of(Object)
and the Java date and time classes such as DateTimeFormatter.ofPattern(String)
.
of
method and the mandatory parameters for creating the target object. The builder provides methods
to fill each target object's optional field.
To create the target object a method called Builder.build()
has to be executed.
The Address
object with the AddressBuilder
is a good example since it contains only the country as mandatory parameter and a lot of optional fields:
final Address commercetoolsMunich = AddressBuilder.of(CountryCode.DE) .company("commercetools GmbH") .streetName("Adams-Lehmann-Str.").streetNumber("44") .postalCode("80797").city("München").build();
See the test code.
The invariants of builders in the SDK:
final AddressBuilder builder = AddressBuilder.of(CountryCode.GB) .firstName("John").lastName("Smith"); final Address john1 = builder.build(); final Address john2 = builder.build(); assertThat(john1 == john2) .overridingErrorMessage("different build() calls create different instances") .isFalse(); final AddressBuilder builder1 = builder.firstName("Stefanie"); final AddressBuilder builder2 = builder.firstName("Matt"); assertThat(builder1 == builder && builder2 == builder1) .overridingErrorMessage("builders are mutable and return themselves") .isTrue(); assertThat(builder1.build().getFirstName()) .overridingErrorMessage("the last setting wins") .contains("Matt");
See the test code.
Some builders support a model as prototype:
//we need an address in advance final Address template = AddressBuilder.of(CountryCode.GB) .firstName("John").lastName("Smith").build(); //create an address builder and use an address as template final AddressBuilder builder = AddressBuilder.of(template); final Address address = builder.firstName("Matt").build(); assertThat(address.getLastName()) .overridingErrorMessage("not overwritten values are used from the template") .contains("Smith"); assertThat(address.getFirstName()) .overridingErrorMessage("fields can be overwritten in the builder") .contains("Matt");
See the test code.
final MonetaryAmount eur100 = MoneyImpl.of(100, EUR); final PriceDraft price0 = PriceDraft.of(eur100);//price without country //builder style final PriceDraft price1 = PriceDraftBuilder.of(eur100).country(DE).build(); //of method + copy method final PriceDraft price2 = PriceDraft.of(eur100).withCountry(DE); //withCountry semantically the same to final PriceDraft price3 = PriceDraftBuilder.of(PriceDraft.of(eur100)).country(DE).build(); assertThat(price1).isEqualTo(price2).isEqualTo(price3) .isNotEqualTo(price0);
See the test code.
OffsetDateTime.withMinute(int)
.
For persistent changes you need to use a commercetools Composable Commerce
client and to execute a Command
. Available commands for the Composable Commerce API resources
are listed in SphereResources
CreateCommand
: command to create a resourceUpdateCommand
: command to update an existing resourceDeleteCommand
: command to delete resources