blob: bea2f66439c141992a7fc710b3c452cf5f4f4867 [file] [view] [edit]
Consider an instance method that is not an override, is not overrideable itself,
and never accesses `this` (explicitly or implicitly) in its implementation. Such
a method can always be marked `static` without harm.
The main benefit of adding `static` is that a caller who wants to use the method
and doesn't already have an instance handy won't have to conjure one up
unnecessarily. Doing that is a pain, and in unit tests it also creates the false
impression that instances in multiple states need to be tested.
But adding `static` also benefits your implementation in some ways. It becomes a
little easier to read and to reason about, since you don't need to wonder how it
might be interacting with instance state. And auto-completion will stop
suggesting the names of instance fields and methods (which you probably don't
want to use).
This analogy might work for you: it's widely accepted that a method like this
shouldn't declare any parameters it doesn't actually use; such parameters should
normally be removed. This situation with `static` is fairly similar: in either
case there is one additional instance the caller needs to have in order to
access the method. So, adding `static` is conceptually similar to removing that
unused parameter.
## Suppression
Methods which are used by reflection can be annotated with `@Keep` to suppress
the warning.
The `@Keep` annotation can also be applied to annotations, to suppress the
warning for any member annotated with that annotation.
```java
import com.google.errorprone.annotations.Keep;
@Keep
@Retention(RetentionPolicy.RUNTIME)
@interface SomeAnnotation {}
...
public class Data {
@SomeAnnotation
int doSomething(int x) {
return x;
}
}
```
All false positives can be suppressed by annotating the variable with
`@SuppressWarnings("MethodCanBeStatic")`.