Java Code Static Final变量用法

时间:2012-09-13 09:02:33

标签: java static final

我下面有两节课。两者都有一个带有getter的变量'reply'。此变量没有setter方法。唯一的区别在于ClassOne,变量是静态最终的。

那么差异是什么,哪一个更受欢迎?

public class ClassOne {

    private static final String reply = "Success";
    ..

    public String getReply() {
        return reply;
    }

    // no setter

}

和第2类

public class ClassTwo {

    private String reply = "Success";
    ..

    public String getReply() {
        return reply;
    }

    // no setter
}

更新1:

我想知道的是,当变量没有setter时,是否应该将变量声明为 static final 进行优化?或者没关系?

7 个答案:

答案 0 :(得分:4)

  

应该将变量声明为静态最终用于优化吗?

  • final当然,不仅仅是为了优化而是为了清晰,因为它可以使你的对象不可变,这总是一件好事。

  • static完全改变了字段的性质,与setter的存在无关:你只想要该字段的一个实例,还是每个类的实例需要一个?

  • 非静态示例:Person有一个名称,它是一个常量(对于给定的人=每个实例),因此您可以使用非静态最终字段,您只需设置一次创建新的Person

        private final String name;
  • 静态示例:每当您没有Person的名称时,您希望使用默认值 - 这是一个全局常量,在所有没有名称的人之间共享可以使用静态最终字段:
        private static final String NO_NAME = "John Doe";

答案 1 :(得分:3)

当您将变量设置为final时,您告诉每个人(编译器,运行时)它无法更改。这可以通过优化来帮助很多,例如使用其值来内联变量的所有出现。

答案 2 :(得分:2)

将引用设置为final可确保您无法更改引用。但请注意,如果引用的对象是 mutable ,那么您仍然可以更改它(不是在此实例中,因为字符串是immutable)。

我通常创建字段final并在构造函数中初始化它们。通过支持不变性,我的类更容易调试,并且更有可能在线程环境中安全。删除不变性约束比添加它更容易。

我也是为方法参数做的。我很少(永远)想要更改方法参数,并使它们最终将捕获无意的分配。

我尝试使用static,但最终常量除外。除非它类似于记录器,否则我真的不希望每个类有一个实例,并且(当然)这在多个类加载器的情况下不起作用。它也接近单一反模式,这会影响简单测试和(可能)线程化。

答案 3 :(得分:2)

如果有一个无法更改的常量字符串,则应将其设为静态最终字符串。

静态意味着类的实例需要更少的内存,因为实例不需要单独的副本。

Final允许一些优化,从而使您的程序更快。

答案 4 :(得分:2)

很少有事情要知道:

  • 编译器可以检查最终变量是否意外更改它们。
  • 实例中包含对非静态变量的引用,因此除了
  • 之外还有少量不必要的内存消耗
  • 静态变量在同一个类的所有实例之间共享,因此您可以确保所有实例都使用相同的值
  • 最终的静态变量,尤其是字符串在编译时链接,因此不需要在运行时从字段中取消引用它们。由于它甚至不能通过反射来改变,因为在运行时不使用这样的字段。

答案 5 :(得分:1)

您创建变量static的事实意味着该变量的单个实例将在ClassOne的所有实例之间共享,因为变量绑定到类本身,而不是它的实例。除了任何JVM优化之外,对于reply的每个实例,您都会有ClassTwo的单个实例。

答案 6 :(得分:1)

  

第一个是Constant,你需要在编译时知道它的值。

private static final String reply = "Success";

第二个只是简单的成员变量。所以任何情况下第一个都是首选,因为第二个将为每个对象创建价值。

Assuming that you intended **private final String reply** in second case

  

最终变量只能通过初始值设定项或赋值语句初始化一次。它不需要在声明点初始化:这称为“空白最终”变量。

在第二种情况下,您还可以在构造函数

中声明并初始化它
 private final String reply;

您可以阅读更多相关信息here