| A method or constructor with one or more parameters whose declaration is | |
| annotated with the `@CompileTimeConstant` type annotation must only be invoked | |
| with corresponding actual parameters that are computed as compile-time constant | |
| expressions, specifically expressions that: | |
| * the Java compiler can determine a constant value for at compile time (see | |
| [JLS ยง15.28](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.28)), | |
| or | |
| * consist of the literal {@code null}, or | |
| * consist of a single identifier, where the identifier is a formal method | |
| parameter or class field that is effectively final and has the | |
| `@CompileTimeConstant` annotation, or | |
| * are ternary expressions with both branches being compile-time constants, or | |
| * are formed from the concatenation of other compile time constant `String`s, | |
| or | |
| * are Guava immutable collection factories with compile-time constant entries. | |
| For example, the following are valid compile-time constants: | |
| * `"some literal string"` | |
| * `"literal string" + compileTimeConstantParameter` | |
| * `debug ? compileTimeConstantParameter : "foo"` | |
| * `ImmutableList.of("a", "b", "c")` | |
| When applied to fields, this check enforces that the field is `final` and has an | |
| initializer which satisfies the above conditions. | |
| Getting Java 8 references to methods with `@CompileTimeConstant` parameters is | |
| disallowed because we couldn't check if the method reference is later applied to | |
| a compile-time constant. Use the methods directly instead. | |
| For the same reason, it's also disallowed to create lambda expressions with | |
| `@CompileTimeConstant` parameters. |