【发布时间】:2015-12-09 22:55:37
【问题描述】:
在课堂上,我声明了一个从作业开始就不会改变的字段。该字段(准确地说是常量)也由该类的所有实例共享。
出于以上两个原因,我使用的是
最终
和
静态
声明常量时的关键字。
但是,由于我同时使用 final 和 static,我需要在声明时分配一个值,因为在加载类时常量被分配了它的值。不幸的是,在这种情况下,无法做到这一点,因为程序从一开始就不知道该值,而只有在实例化类时才知道(因为它的值是由程序计算出来的)。因此,必须根据传递给它的参数在类的构造函数中为其赋值。
如前所述,这在 java 中是非法的。
我不知道如何解决这个问题。一切都表明我应该同时使用 static 和 final,因为该字段由该类的所有实例共享,并且从为其分配值的那一刻起就不会改变。
此外,根据 Android 文档,使用 final 关键字具有以下优点:
访问 [a final field] 将使用相对便宜的“字符串 常量”指令而不是字段查找。
此外,使用 static 关键字的优点是所有实例只使用一个字段,而不是每个实例使用一个字段。
因此,出于性能原因,我能够同时使用这两个关键字非常重要。
总结:我需要同时使用 final 和 static 但是,因为在类加载时常量的值是未知的,所以我不能这样做。是否有解决方法,以便我仍然可以使用 final 和 static 作为我的常量?
【问题讨论】:
-
你能在静态初始化器中做还是有一个提供值的静态方法?
-
一个常量在编译时是已知的,或者可以在编译时从其他常量派生而来。在 Java 中,它们表示为
static final字段。如果你不知道它在编译时的价值,那么它就不是一个常数。只需使用常见的static字段即可。