A common pattern for abstract Builders
is to declare an instance method named
self()
, which subtypes override and implement as return this
(see Effective
Java 3rd Edition, Item 2).
Returning anything other than this
from an instance method named self()
with
a return type that matches the enclosing class will be confusing for readers and
callers.
If an unchecked cast is required, prefer a single-statement cast, with the suppression on the method (rather than the statement). For example:
@SuppressWarnings("unchecked")
default U self() {
return (U) this;
}
Instead of:
default U self() {
@SuppressWarnings("unchecked")
U self = (U) this;
return self;
}
Suppress false positives by adding the suppression annotation @SuppressWarnings("SelfAlwaysReturnsThis")
to the enclosing element.