| 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")`. |