繁体   English   中英

Java代码静态最终变量用法

[英]Java Code Static Final variable usage

我下面有两节课。 两者都有一个带有getter的变量“ reply”。 此变量没有设置方法。 唯一的区别在于ClassOne,变量为static final。

那么有什么区别,哪个是首选?

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:

我想知道的是,当没有变量的设置器时,是否应将变量声明为static final进行优化? 还是没关系?

变量应该声明为static final进行优化吗?

  • final肯定是,不仅为了优化而且为了清晰起见,因为它可以使您的对象不可变,这始终是一件好事。

  • static完全改变了字段的性质,并且与设置器的存在无关:您只需要该字段的一个实例,还是每个类的实例需要一个实例?

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

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

当您将变量设置为final时,您是在告诉所有人(编译器,运行时)不能更改它。 这可以为优化提供很多帮助,例如将变量的所有出现与其值内联。

将参考设置为final可以确保您不能更改参考。 但是请注意,如果所引用的对象是可变的,那么您仍然可以更改它(在这种情况下不可以,因为String是immutable )。

我通常将字段final并在构造函数中对其进行初始化。 通过支持不变性,我的类更易于调试,并且在线程环境中更安全。 删除不变性约束比添加约束更容易。

对于方法参数,我也这样做。 很少(曾经)我想更改方法参数,并将它们设置为final将捕获无意中的赋值。

除了最终常量,我尽量不要使用static 除非它像一个记录器,否则我真的不希望每个类有一个实例,并且(当然)在多个类加载器的情况下这是行不通的。 它也越来越接近单例反模式,这会影响易于测试和(可能)线程化。

当您有一个不能更改的常量字符串时,应将其设为静态最终字符串。

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

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

有几件好事要知道:

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

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

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

private static final String reply = "Success";

第二个只是简单的成员变量。 因此,无论哪种情况,第一个都是首选,因为第二个将为每个对象创建值。

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

最终变量只能通过初始化程序或赋值语句初始化一次。 不需要在声明时进行初始化:这称为“空白最终”变量。

在第二种情况下,您也可以在构造函数中声明和初始化

 private final String reply;

您可以在这里了解更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM