Back to Error Prone

SelfSet

docs/bugpattern/SelfSet.md

2.49.0963 B
Original Source

A setter invoked with a value from the corresponding getter is often a mistake, for example:

java
if (from.hasFrobnicator()) {
  to.setFrobnicator(to.getFrobnicator());
}

This is easy to accidentally write, but is clearly meant to be,

java
if (from.hasFrobnicator()) {
  to.setFrobnicator(from.getFrobnicator());
}

The Java proto API is tolerant enough that the former code will compile and execute fine, but it will set frobnicator to the default value for that field.

This pattern is occasionally used to ensure that a field is always present, even if it takes the default value, for example,

java
// ensure "always_present" is present
builder.setAlwaysPresent(builder.getAlwaysPresent());

This is not a no-op, but we'd encourage being more explicit about the condition,

java
if (!builder.hasAlwaysPresent()) {
  builder.setAlwaysPresent(false);
}

Or if builder is otherwise untouched, builder.setAlwaysPresent(false).