什么时候我们应该使用“public static final String”?

时间:2012-07-26 20:39:27

标签: java final

我看过很多人写的代码public static final String mystring = ... 然后只使用一个值。

他们为什么要那样做?为什么在使用它之前必须将值初始化为final

更新

好的,谢谢你所有的答案,我理解这些关键的意义(公共静态决赛)。我不明白为什么人们使用它,即使常量只在一个地方使用而且只在同一个类中使用。为什么宣布它?为什么我们不只是使用变量?

12 个答案:

答案 0 :(得分:70)

final表示变量的值不会改变 - 换句话说,是一个在声明后无法修改其值的变量。

如果要创建public final static String,请使用String

  1. 属于类(static:没有必要使用它的实例),以及
  2. 不会更改(final),例如,当您要定义一个String常量,该常量可用于该类的所有实例,以及使用该类的其他对象。
  3. 示例:

    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可以允许实现执行某些优化,例如,通过内联使用常量的实际值。

答案 1 :(得分:9)

  1. 静态意味着..您可以在不实例化类或使用任何对象的情况下使用它。
  2. final..It是一个用于使字符串不变的关键字。您无法更改该字符串的值。请看下面的例子:

      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  
                 } 
             } 
    
  3. 由于

答案 2 :(得分:4)

关键字 final 表示该值为常量(无法更改)。它类似于C中的const。

您可以将 static 视为具有范围的全局变量。它基本上意味着如果你为一个对象改变它,它就会像全局变量一样被改变(受范围限制)。

希望它有所帮助。

答案 3 :(得分:2)

final表示设置后无法更改该值。 static允许您设置值,并且该值对于使用它的类的所有实例都是相同的。此外,您可以访问具有类实例的public static字符串的值。

答案 4 :(得分:2)

static表示该对象只会被创建一次,并且没有包含它的实例对象。当你有一个对于课堂上所有对象都很常见且永远不会改变的东西时,最好使用你所编写的方式。甚至可以在不创建对象的情况下使用它。

通常最好在期望它为final时使用final,这样编译器就会强制执行该规则,而且您肯定知道。 static确保您不会浪费内存创建许多相同的东西,如果它对所有对象都是相同的值。

答案 5 :(得分:1)

通常用于定义常量,您可以在许多地方重复使用,使其成为单点更改,在单个类中使用或在包中共享。最终做出变量可以避免意外更改。

答案 6 :(得分:1)

公开使其可以在其他类中访问。您可以在不实例化类或使用任何对象的情况下使用它。

static 使其在所有类实例中均匀化。 如果所有对象的值相同,它可以确保您不会浪费内存创建许多相同的内容。

最终使其成为不可修改的值。它是一个"常数"所有类实例中的值相同且无法修改。

答案 7 :(得分:0)

public可以在其他课程中访问它。 static使所有类实例的值均匀。 final使其成为不可修改的值。 所以基本上它是一个“常量”值,它在所有类实例中都是相同的,并且无法修改。 关于你的关注“我不理解的是为什么人们使用它,即使常量只用在一个地方而且只用在同一个类中。为什么要声明它?为什么我们不使用变量呢?” 我会说因为它是一个公共字段,所以常量值也可以在其他类中使用ClassName.value在其他地方使用。例如:一个名为Math的类可以将PI作为最终的静态long值,可以作为Math.PI进行访问。

答案 8 :(得分:0)

为什么人们在类中使用常量而不是变量?

可读性和可维护性,

在你的代码中有一些像40.023这样的数字并没有多说这个数字代表什么,所以我们用大写字母替换它,例如" USER_AGE_YEARS"。稍后当我们查看代码时,清楚这个数字代表什么。

为什么我们不只是使用变量?好吧,如果我们知道这个数字会改变,我们会这么做,但是如果它的数字不会改变,比如3.14159 ......我们会把它作为最终数字。

但是如果它不是像String这样的数字呢?在这种情况下,它主要用于可维护性,如果您在代码中多次使用String,(并且它不会在运行时更改),将它作为类顶部的最终字符串很方便。这样,当你想要改变它时,只有一个地方可以改变它而不是很多。

例如,如果您的代码中有多次打印错误消息,那么最终字符串ERROR_MESSAGE ="有些东西变坏了。"如果你想改变它,那就更容易维护了;有些东西变坏了。"到了"已经太晚了,他已经死了#34;你只需要更改那一行,而不是你要使用那条评论的所有地方。

答案 9 :(得分:0)

这是一种标准/最佳实践。 已经有列出方案的答案,但是您的第二个问题是:

  

他们为什么必须这样做?为什么在使用它之前必须将值初始化为final?

在声明中初始化的公共常量和字段应该是“ static final”,而不仅仅是“ final”

这是为什么应该这样的一些原因:

  1. 将公共常量作为final而不是static final导致对类的每个实例复制其值,无用地增加了执行应用程序所需的内存量。

  2. 此外,当非公开的final字段也不是静态的时,表示不同的实例可以具有不同的值。但是,由于final字段的行为,在其声明中初始化一个非静态的final字段会强制每个实例具有相同的值。

答案 10 :(得分:0)

您不必不必使用final,但是final对包括编译器在内的其他所有人都清楚这是一个常数,这很不错练习吧。

为什么人们会这么做即使常量仅在一个地方且仅在同一类中使用:因为在许多情况下,它仍然有意义。例如,如果您知道它在程序运行期间将是最终的,但是您打算稍后更改该值并重新编译(更易于查找),并且以后可能会更频繁地使用它。它还在其他重要位置通知其他程序员程序流中的核心价值。

不幸的是,其他答案缺少一个方面,就是需要{strong>非常仔细地使用public final的组合,尤其是在其他类或程序包将使用您的类的情况下(可以假定是因为它是public

这是为什么:

  1. 由于声明为final,因此编译器将在编译期间将此字段内联到读取此字段的任何编译单元中。到目前为止,一切都很好。
  2. 人们容易忘记的是,由于该字段也被声明为public,因此编译器还将此值内联到任何其他编译单元中。这意味着使用此字段的 other 类。

会有什么后果?

想象一下你有这个:

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);
  }
}

编译并运行Bar后,您将获得:

I am using version 1.0

现在,您需要改进Foo,并将版本更改为“ 1.1”。 重新编译Foo后,您运行Bar并得到以下错误输出:

I am using version 1.0

之所以会这样,是因为VERSION被声明为final,所以它的实际值已经在第一次编译运行期间内嵌在Bar中。因此,为了使public static final ...字段的示例在实际更改声明的final之后(您撒谎!;)正确传播,您需要使用它重新编译每个类< / em>。

我已经看过几次了,真的很难调试。

如果用final表示常量,则可能在程序的更高版本中更改 ,那么更好的解决方案是:

class Foo {
  private static String version = "1.0";
  public static final String getVersion() {
    return version;
  }
}

这对性能的影响可以忽略不计,因为JIT代码生成器会在运行时内联它。

答案 11 :(得分:0)

这与代码的语义有关。通过命名该值并将其分配给具有有意义名称的变量(即使它仅在一个地方使用),您就赋予了它一个含义。当有人阅读代码时,该人就会知道该值的含义。

一般来说,在代码中使用常量值并不是一个好习惯。想象一个充满字符串、整数等值的代码。一段时间后,没有人会知道这些常数是什么。当值在多个地方使用时,值中的拼写错误也可能是一个问题。