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), 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 Strings, 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.