A compile time constant expression is an expression whose value can be determined at compile time and can not include any value that could possibly change after compilation.
A compile-time constant expression is an expression denoting a value of primitive type or a String that does not complete abruptly and is composed using only the following,
# Literals of primitive type and literals of type String
# Casts to primitive types and casts to type String
# The unary operators +, -, ~, and ! (but not ++ or --)
# The multiplicative operators *, /, and %
# The additive operators + and -
# The shift operators <<, >>, and >>>
# The relational operators <, <=, >, and >= (but not instanceof)
# The equality operators == and !=
# The bitwise and logical operators &, ^, and |
# The conditional-and operator && and the conditional-or operator ||
# The ternary conditional operator ? :
# Parenthesized expressions whose contained expression is a constant expression.
# Simple names that refer to constant variables.