Non-abstract instance methods named 'self()' or 'getThis()' that return the enclosing class must always 'return this'


The problem

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:

  default U self() {
    return (U) this;

Instead of:

  default U self() {
    U self = (U) this;
    return self;


Suppress false positives by adding the suppression annotation @SuppressWarnings("SelfAlwaysReturnsThis") to the enclosing element.