【问题标题】:Initializing a static final field in static initializer does not give me a compile-time-constant (Java)在静态初始化程序中初始化静态最终字段不会给我一个编译时间常数(Java)
【发布时间】:2013-07-25 09:12:39
【问题描述】:

我尝试在 servlet 中使用注释 @MultipartConfig(location=Test.MY_CONST)。

当我从下面使用 Code 1 时,它工作得很好。当我从下面使用 Code 2 时,编译时会得到以下输出:

错误:属性值必须是常量
@MultipartConfig(location=Test.MY_CONST)


代码 1

public class Test {
    public static final String MY_CONST = "/constant/path";
}


代码 2

public class Test {
    public static final String MY_CONST;
    static {
        MY_CONST = "/constant/path";
    }
}

问题: 我有几个问题可以归结为“这是怎么回事?

  1. 代码 1代码 2 之间有什么区别?
  2. 我收到这个错误是因为@MultipartConfig 需要一个编译时间常数,并且在静态初始化程序中为MY_CONST 分配一个编译时间常数不会使MY_CONST 成为一个编译时间常数吗?李>
  3. 如果我用反射改变MY_CONST 的值,如果是代码2System.out.println(Test.MY_CONST) 会打印什么?

【问题讨论】:

  • 如果它是在静态块中初始化的,你可能有一个if 或其他根据一些内部/外部属性改变它的值的语句。那么这不是一个常数。

标签: java constants static-variables static-initialization


【解决方案1】:

您不能更改“最终”变量。不能更改“常量”变量。也是直接初始化的。

【讨论】:

  • 我不想改变最终变量。我正在尝试使用最终变量 MY_CONST 作为编译时间常数。但是如果我使用 Code 2 来初始化该常量的值,我就不能这样做。
猜你喜欢
  • 2014-10-06
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多