在一个类中,我声明了一个从作业开始就不会改变的字段。该字段(或准确地说是常量)也由该类的所有实例共享。
出于以上两个原因,我正在使用
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/