我下面有两节课。两者都有一个带有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 进行优化?或者没关系?
答案 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