为什么我们声明常量,是否有必要使它们成为静态?

时间:2014-02-14 13:03:55

标签: java static constants final

我知道常量是那些值无法更改的变量,但是如果程序的任何部分没有更改它们的值,它们是否仍然需要声明final?它似乎也必须是静态的。那是为什么?

6 个答案:

答案 0 :(得分:6)

您实际上是在问我想要回答几个问题。

为什么要使用常量?

常量用于避免代码中的magic numbers/strings。如果您的代码中有多个字符串出现,那么一旦您需要更改该字符串,您只需要更改常量定义,而不是更改代码中每次出现的字符串。此外,如果只使用一个常数,它通常是一件好事,因为它具有更好的可见性。

final关键字。

它的目的(至少在这种情况下)是双重的。一个是让程序员无法改变价值。你可能已经忘记它是一个常数。另一种是告诉编译器该值在运行时不能更改。这可用于创建优化的字节码(例如,可以删除常量,并且每次出现都会被编译器的值替换。)

static关键字。

在Java中,一切都是一个类。每个 Class 都可以有多个实例(对象)。如果你不将常量标记为static,则每个对象都有“自己的常数”。既然你不想要将它标记为静态是有意义的。静态字段(或方法)每个类只存在一次(而不是每个类的对象一次)。

答案 1 :(得分:4)

当然可以宣布非静态决赛:

class Employee {
  final String empId;

  public Employee(String empId) { this.empId = empId; }
}

在其他情况下,您希望字段在类的所有实例中保持不变:

class Color {
  final static int BLACK = 0xFFFFFF;
}

至于为什么你想要声明它们final而不是永远不改变它们,

  • 它提高了程序的可读性,它告诉读者程序有关其行为的一些内容,否则必须在文档中
  • 编译器提醒您是否尝试错误地更改

答案 2 :(得分:3)

通常,当您要在代码上使用常量值时,声明最终的静态变量。这可以防止你在代码周围散布“魔术值”,这不是一个好的做法,因为可持续性和易读性原因。

如果您未声明最终,则其他人(或您,如果您忘记了初始意图)制作的代码可能会修改该变量。

如果你没有声明它们静态,你创建的类的每个实例都会有一个副本,你也必须创建一个实例来获取值。这通常不是你想要的。

答案 3 :(得分:3)

因为静态属于类而不是任何实例。

在所有实例中共享static个单一副本时。 instance成员拥有个人副本的地方。

考虑你需要在游戏的每个阶段(阶段课程)中增加/减少游戏分数(count)。

enter image description here

答案 4 :(得分:2)

这不是绝对必要的,但出于记忆效率的原因推荐它:

如果你没有将你的常量声明为static,那么创建的每个类的实例(可能是数千个)将保留它在内存中的常量(或至少是对它的引用)的值,而static成员每个班级只保留一次 - 因为无论如何它都是常数,这就足够了。

答案 5 :(得分:2)

我们声明常量因为我们总是需要一些在代码中修复的“幻数”。使用常量意味着它们更容易被发现,并且当您更改它们时,您将通过编辑更改所有这些。

想象一下,您的代码定义了您的窗口会显示15条记录,并且您会在15岁时将其视为成年人。如果没有常量,更改窗口的大小意味着您必须找到15次发生,不要错过任何一次,并且不要更改15,这意味着错误的年龄。

static部分是因为您不想实例化一个对象来获取与特定实例无关的数据(这正是static的意思,顺便说一句,不仅仅是在使用时对于常数)。