注释@EnableRedisHttpSession值用常量的值初始化SESSION_TIME_TO_LIVE:
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = SessionConfig.SESSION_TIME_TO_LIVE)
public class SessionConfig extends AbstractHttpSessionApplicationInitializer {
public static final Integer SESSION_TIME_TO_LIVE = 600;
...
}
尝试启动应用程序时,出现错误:java: element value must be a constant expression. 由于该字段SESSION_TIME_TO_LIVE具有不可变类型Integer,并且用 标记final,因此可以将其视为常量。那么为什么会出现错误呢?
奇怪的是,如果您将其替换Integer为int. 有趣的是,使用 也没有问题String,尽管它不是原始的:
@RestController
@RequestMapping(AdminReportController.REST_URL)
@AllArgsConstructor
public class AdminReportController {
protected static final String REST_URL = "/reports";
...
为什么会这样?
Integer是原始类型int的包装类,不能是常量表达式,因为 类实例的创建发生在程序执行期间,并且常量表达式必须在程序启动之前由编译器计算。
至于String类,我可以说,与大多数其他语言一样,这个类之所以与众不同,原因很简单:任何程序中的大部分常量都是字符串文字。仅仅为了面向对象的方法,在程序启动时将它们复制到动态内存是很浪费的。Java 中的字符串字面量对象实际上是对 DATA 段中的内存位置的引用,编译器可以将它们视为原始数据。