[英]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.