Re: Records — Dealing with nullable values
Brian Goetz
brian.goetz at oracle.com
Sat Dec 14 22:14:24 UTC 2019
No, that would not be a good idea. If you find yourself using Optional
for a method parameter, or a field type, or a record component type,
you've almost certainly gone Optional-crazy. It's a common, but
curable, disease.
What you want to do is this:
record Foo(String name, Gender gender) {
Foo {
requireNonNull(name);
requireNonNull(gender);
}
}
The `Foo { ... }` is a _compact constructor_, which is a constructor
whose signature is the same as that of the record, and which
automatically handles the `this.x = x` boilerplate for you. This is
where you put argument validation / normalization.
On 12/14/2019 5:01 PM, Arash Shahkar wrote:
> Hi,
>
> I’ve been using Lombok for quite a while now to automatically generate boilerplate code for "data carrier" classes. However, a pattern I really like and have found to work very well is to verify non-nullity of all the fields that must not be null, and return an Optional<Field> from the accessor of a field if it’s allowed to have a null value. Consider:
>
> @lombok.Value
> class Person {
>
> String name;
> Gender gender;
>
> Person(String name, Gender gender) { … } // customize the constructor, verifying that name is defined and valid
>
> Optional<Gender> getGender() { // customize the accessor for gender, to make sure calling code deals with the possibility of gender being null
> return ofNullable(gender);
> }
> }
>
> Doing a similar thing with records is not possible, due to the fact that the accessor for gender has to exactly return a Gender. With the current specification for records, the only option is to do:
>
> record Person(String name, Optional<Gender> gender) {
> …
> }
>
> Is this considered good practice? Do you suggest any alternatives?
More information about the amber-dev
mailing list