We encourage to use the QrInvoiceBuilder for creating QrInvoice instances as it guarantees proper object creation and implicitly performs validation. The builder supports two styles as you in the next two code examples. Choose whichever you like better.

Fully Fluent Style Using Lambdas

import ch.codeblock.qrinvoice.model.QrInvoice;
import ch.codeblock.qrinvoice.model.builder.QrInvoiceBuilder;
import ch.codeblock.qrinvoice.model.validation.ValidationException;
import ch.codeblock.qrinvoice.model.validation.ValidationResult;

import java.time.LocalDate;
import java.time.Month;

// ..
try {
    final QrInvoice qrInvoice = QrInvoiceBuilder
    .create()
    .creditorIBAN("CH4431999123000889012")
    .paymentAmountInformation(p -> p
        .chf(1949.75)
        .date(LocalDate.of(2019, Month.OCTOBER, 31))
    )
    .creditor(c -> c
        .name("Robert Schneider AG")
        .streetName("Rue du Lac")
        .houseNumber("1268")
        .postalCode("2501")
        .city("Biel")
        .country("CH")
    )
    .ultimateCreditor(u -> u
        .name("Robert Schneider Services Switzerland AG")
        .streetName("Rue du Lac")
        .houseNumber("1268/3/1")
        .postalCode("2501")
        .city("Biel")
        .country("CH")
    )
    .ultimateDebtor(d -> d
        .name("Pia-Maria Rutschmann-Schnyder")
        .streetName("Grosse Marktgasse")
        .houseNumber("28")
        .postalCode("9400")
        .city("Rorschach")
        .country("CH")
    )
    .paymentReference(r -> r
        .creditorReference("RF18539007547034")
        .unstructuredMessage("Instruction of 15.09.2019##S1/01/20170309/11/10201409/20/1400 0000/22/36958/30/CH106017086/40/1020/41/3010")
    )
    .alternativeSchemeParameters(null)
    .build();
} catch (ValidationException validationException) {
    final ValidationResult validationResult = validationException.getValidationResult();
    // handle exception...
}

For more details on the ValidationResult see How to validate a QrInvoice object

Semi-Fluent Style

import ch.codeblock.qrinvoice.model.QrInvoice;
import ch.codeblock.qrinvoice.model.builder.QrInvoiceBuilder;
import ch.codeblock.qrinvoice.model.validation.ValidationException;
import ch.codeblock.qrinvoice.model.validation.ValidationResult;

import java.time.LocalDate;
import java.time.Month;

// ..
try {
    final QrInvoiceBuilder qrInvoiceBuilder = QrInvoiceBuilder.create()
            .creditorIBAN("CH4431999123000889012");

    qrInvoiceBuilder.paymentAmountInformation()
            .chf(1949.75)
            .date(LocalDate.of(2019, Month.OCTOBER, 31));

    qrInvoiceBuilder.creditor()
            .name("Robert Schneider AG")
            .streetName("Rue du Lac")
            .houseNumber("1268")
            .postalCode("2501")
            .city("Biel")
            .country("CH");
    qrInvoiceBuilder.ultimateCreditor()
            .name("Robert Schneider Services Switzerland AG")
            .streetName("Rue du Lac")
            .houseNumber("1268/3/1")
            .postalCode("2501")
            .city("Biel")
            .country("CH");
    qrInvoiceBuilder.ultimateDebtor()
            .name("Pia-Maria Rutschmann-Schnyder")
            .streetName("Grosse Marktgasse")
            .houseNumber("28")
            .postalCode("9400")
            .city("Rorschach")
            .country("CH");

    qrInvoiceBuilder.paymentReference()
            .creditorReference("RF18539007547034")
            .unstructuredMessage("Instruction of 15.09.2019##S1/01/20170309/11/10201409/20/1400 0000/22/36958/30/CH106017086/40/1020/41/3010");

    qrInvoiceBuilder.alternativeSchemeParameters(null);

    final QrInvoice qrInvoice = qrInvoiceBuilder.build();
} catch (ValidationException validationException) {
    final ValidationResult validationResult = validationException.getValidationResult();
    // handle exception...
}