java-我们到底什么时候应该使用“ public static final String”?
我见过很多人写final的代码然后只使用一个值。
他们为什么要这样做? 为什么在使用它之前必须将值初始化为final?
更新
好的,感谢您的所有回答,我了解这些键(公共静态最终键)的含义。 我不明白的是,为什么人们会使用该常量,即使该常量仅在一个地方且仅在同一类中使用。 为什么要宣布呢? 我们为什么不只使用变量?
storm_buster asked 2020-07-13T09:33:49Z
11个解决方案
78 votes
final表示该变量的值不会改变-换句话说,一个变量的值在声明后不能修改。
当您要创建String时,请使用final:
属于该类(final:无需使用任何实例),并且
不会更改(296445241431818969856),例如,当您要定义String常量,该常量可用于该类的所有实例以及使用该类的其他对象时。
例:
public final static String MY_CONSTANT = "SomeValue";
// ... in some other code, possibly in another object, use the constant:
if (input.equals(MyClass.MY_CONSTANT)
类似地:
public static final int ERROR_CODE = 127;
不需要使用final,但它可以防止常量在程序执行过程中被无意更改,并且可以指示变量是常量。
即使仅在当前类和/或仅在一个位置使用该常量,也要在所有位置将其声明为final,这是一个好习惯:更清楚,在代码的生存期内,该常量可能最终被使用 在一个以上的地方。
此外,使用final可以允许该实现执行一些优化,例如。 通过内联使用常数的实际值。
pb2q answered 2020-07-13T09:34:34Z
9 votes
静态方式。您可以在不实例化类或使用任何对象的情况下使用它。
final ..这是一个用于使字符串恒定的关键字。 您不能更改该字符串的值。 看下面的例子:
public class StringTest {
static final String str = "Hello";
public static void main(String args[]) {
// str = "world"; // gives error
System.out.println(str); // called without the help of an object
System.out.println(StringTest.str);// called with class name
}
}
谢谢
Omar Faroque Anik answered 2020-07-13T09:35:03Z
4 votes
关键字final表示该值是常量(不能更改)。 它类似于C中的const。
您可以将static视为具有范围的全局变量。 基本上,这意味着如果您为一个对象更改它,则所有对象都将更改,就像全局变量(受范围限制)一样。
希望能帮助到你。
Fyre answered 2020-07-13T09:35:32Z
2 votes
final指示一旦设置该值就无法更改。 static允许您设置值,并且对于使用该值的类的所有实例,该值都将相同。 另外,您可以访问没有类实例的public static字符串的值。
Madbreaks answered 2020-07-13T09:35:52Z
2 votes
final意味着该对象将仅创建一次,并且没有包含该对象的实例对象。 当您拥有该类的所有对象共有的东西并且永不改变时,最好使用编写方式。 甚至可以完全不创建对象就使用它。
通常,最好在您希望将final设置为2964454671743743714304时使用final,以便编译器将强制执行该规则,并且您肯定会知道。 static确保如果所有对象的值相同,则不要浪费内存来创建许多相同的东西。
Carl answered 2020-07-13T09:36:17Z
1 votes
通常用于定义常量,您可以在许多地方重用它们,以使其成为单点更改,在单个类中使用或在包之间共享。 进行可变的final避免意外更改。
devang answered 2020-07-13T09:36:37Z
1 votes
public使它可跨其他类访问。 您可以使用它而无需实例化类或使用任何对象。
static使它在所有类实例中的值相同。如果所有对象的值相同,它可以确保您不会浪费内存来创建许多相同的东西。
final使它的值不可修改。 这是一个“常量”值,在所有类实例中都相同,并且无法修改。
Nikhil Kotak answered 2020-07-13T09:37:06Z
0 votes
public使其可跨其他类访问。static使所有类实例的值统一。final使其值不可修改。因此,基本上,这是一个“常量”值,在所有类实例中相同,并且无法修改。关于您的关注:“我不明白的是,为什么人们会使用该常量,即使该常量仅在一个位置且仅在同一类中使用。为什么要声明它?为什么我们不只是使用该变量呢?”我要说的是,由于这是一个公共字段,因此常量值也可以在其他使用ClassName.value的其他类中使用。 例如:名为Math的类可能会将PI作为最终的静态long值,可以将其作为Math.PI进行访问。
Sachin Tiwari answered 2020-07-13T09:37:27Z
0 votes
人们为什么在类中使用常量而不是变量?
可读性和可维护性,
在您的代码中使用40.023之类的数字并不能说明数字所代表的含义,因此我们将其替换为大写的单词“ USER_AGE_YEARS”。 稍后,当我们查看代码时,很清楚该数字代表什么。
为什么我们不仅仅使用变量? 好吧,如果我们知道这个数字会改变,那么我们会的,但是如果它不会改变某个数字,例如3.14159 ..我们就将其定型。
但是,如果它不是一个像字符串这样的数字呢? 在这种情况下,它主要是出于可维护性,如果您在代码中多次使用String(并且在运行时不会更改),将其作为类的最终字符串放在类顶部很方便。 这样,当您要更改它时,只有一个地方可以更改它,而不是很多地方。
例如,如果您的错误消息在代码中多次打印,则最终字符串ERROR_MESSAGE =“出问题了。” 如果您要从“发生问题的地方”更改它,则更易于维护。 改为“吉姆已经死了,为时已晚”,您只需要更改该行,而无需更改使用该注释的所有位置。
kiwicomb123 answered 2020-07-13T09:38:10Z
0 votes
这是一种标准/最佳实践。已经有列出方案的答案,但是第二个问题是:
他们为什么要这样做? 为什么在使用它之前必须将值初始化为final?
在声明中初始化的公共常量和字段应该是“ static final”,而不仅仅是“ final”
这些是为什么应该这样的一些原因:
将public常量设为final而不是static final会导致为类的每个实例复制其值,无用地增加了执行应用程序所需的内存量。
此外,当非公开的final字段也不是静态的时,意味着不同的实例可以具有不同的值。 但是,由于最终字段的行为,在其声明中初始化非静态最终字段会强制每个实例具有相同的值。
KumarAnkit answered 2020-07-13T09:38:53Z
0 votes
您不必使用final,但是final可以使其他所有人(包括编译器)都清楚这是一个常数,这是其中的一种好习惯。
为什么人们会这样做,即使常量只能在一个地方并且只能在同一类中使用:因为在许多情况下,它仍然有意义。 例如,如果您知道它在程序运行期间将是最终的,但您打算稍后更改该值并重新编译(更易于查找),并且以后可能会更频繁地使用它。 它还在其他重要位置通知其他程序员程序流中的核心价值。
不幸的是,其他答案遗漏的一个方面是,使用final的组合需要非常小心,尤其是在其他类或程序包将使用您的类的情况下(可以假定,因为它是2964457696709313513537)。
原因如下:
因为声明为final,所以编译器将在编译期间将此字段内联到读取该字段的任何编译单元中。 到目前为止,一切都很好。
人们容易忘记的是,由于该字段也被声明为final,因此编译器还将此值内联到任何其他编译单元中。 这意味着使用该字段的其他类。
有什么后果?
想象一下你有这个:
class Foo {
public static final String VERSION = "1.0";
}
class Bar {
public static void main(String[] args) {
System.out.println("I am using version " + Foo.VERSION);
}
}
编译并运行final之后,您将获得:
I am using version 1.0
现在,您可以改进final,并将版本更改为“ 1.1”。重新编译final之后,您运行Bar并得到以下错误输出:
I am using version 1.0
发生这种情况的原因是,将final声明为final,因此在第一次编译运行期间,其实际值已在Bar中内联。 因此,为了让public static final ...字段的示例在实际更改了声明为final的内容后正确传播(您撒谎!;),您需要使用该字段重新编译每个类。
我已经看过几次了,这真的很难调试。
如果用final来表示一个常数,该常数可能会在程序的更高版本中更改,那么更好的解决方案是:
class Foo {
private static String version = "1.0";
public static final String getVersion() {
return version;
}
}
这对性能的影响可以忽略不计,因为JIT代码生成器将在运行时内联它。
nico gawenda answered 2020-07-13T09:40:11Z