java - 对类加载时未知的常量使用 final 和 static

标签 java static final

在一个类中,我声明了一个从作业开始就不会改变的字段。该字段(或准确地说是常量)也由该类的所有实例共享。

出于以上两个原因,我正在使用

final

static

声明常量时的关键字。

但是,因为我同时使用了 final 和 static,所以我需要在声明时赋值,因为常量是在类加载时赋值的。不幸的是,在这种情况下,这无法完成,因为程序从一开始就不知道该值,而只有在类被实例化时才知道(因为它的值由程序计算)。因此,必须根据传递给它的参数在类的构造函数中为其分配值。

如前所述,这在 java 中是非法的。

我不知道如何解决这个问题。一切都表明我应该同时使用 static 和 final,因为该字段由该类的所有实例共享,并且从为其分配值的那一刻起就不会改变。

此外,根据 Android 文档,使用 final 关键字具有以下优点:

accesses to [a final field] will use a relatively inexpensive "string constant" instruction instead of a field lookup.

此外,使用 static 关键字的好处是所有实例只使用一个字段,而不是每个实例使用一个字段。

因此,出于性能原因,我能够同时使用这两个关键字非常重要。

总结:我需要同时使用 final 和 static,但是,因为常量的值在类加载时未知,所以我不能这样做。是否有解决方法,以便我仍然可以使用 final 和 static 作为我的常量?

最佳答案

没有。如果一个静态字段是最终的,那么它必须被内联初始化:

public static final String CONSTANT = "blah";

或在静态初始化器中:

public static final String CONSTANT;
static {
    CONSTANT = "blah";
}

关于如何解决它,这听起来像是一个奇怪的设计,你想在构造函数中初始化值,但它被所有实例使用。构造第二个实例时会发生什么?是否忽略了该参数的值?

关于java - 对类加载时未知的常量使用 final 和 static,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32556339/

相关文章:

Java 可选的 getter 在模型映射器中不起作用

java - JPA 鉴别器值

c++ - 单例 - C++ 中的多线程问题

c# - 在 C# 中,静态构造函数是为对象的每个初始化运行还是只运行一次?

java - 如果我想稍后写入文件,可以将其设为最终文件吗?

java - 在构造函数中设置并且不能更改

java - 创建一个字节数组列表

java - 拆分后为两个变量赋值

python - 通过 apache 提供静态文件

java - 在 ActionListener 中重新定义变量时遇到问题