我们真的需要Java中的静态最终常量吗?
假设我有以下代码:
public class Test {
public static final int A = 1234;
public static int getA()
{
return 1234;
}
}
您能否在效率方面比较以下两种情况?
Test.A
Test.getA()
答案 0 :(得分:9)
假设有一个JIT编译器,效率应该没有明显的差别 - 至少不足以使应用程序的执行速度产生显着差异。
虽然灵活性有明显的提高:在方法中封装值几乎总是好的,因为它可以让你改变以后计算值的方式。
这个规则的一个值得注意的例外是来自数学世界的纯常数:封装对Math.PI
的访问没有多大意义,因为这个基本常量的值不可能是要改变,提示需要切换方法,在程序中获得该值。
答案 1 :(得分:2)
static
final
常量的行为与从方法返回的文字值不同。在某些情况下,java编译器也会在编译时使用 。
一个例子,
public static boolean DEBUG = false;
...
if (DEBUG)
{
...do something...
}
VS
public boolean debug()
{
return false;
}
...
if (debug())
{
...do something 2...
}
在第一种情况下,条件和...做某事......代码将不包含在编译的字节代码(类文件)中。在第二种情况下,条件和...执行2 ...代码将包含在内但从不执行 - 在这种情况下,JIT可能会进行充分的分析,但在运行时删除代码。
有一段时间,在Java的早期,JIT不存在或不够智能,无法优化返回文字值的简单方法。然后,性能需要一个恒定的值。如果你记住外部类(对于公共/受保护的静态最终常量)将在编译时将值烘焙到该字节代码中,那么以这种方式定义常量也更方便;而不是在运行时从源类获取值。
答案 2 :(得分:1)
就效率而言,test.getA()
通常可以通过JIT减少到test.A
。尽管如此,差异最多也是可以忽略不计的。
我们真的需要Java中的静态最终常量吗?
不,但它有助于防止重复分配。
答案 3 :(得分:1)
外部代码无法更改静态最终变量,因此无需封装它们。
此外,没有参数的静态方法建议访问对象的状态,这是一个谎言,因为该方法是静态的。
编译方面,效率应该没有太大差异,但在程序易读性和自我记录代码方面,静态最终版是一个更好的,经过时间考验的选项。
答案 4 :(得分:0)
您展示的案例相当简单,我认为这是有意的。你的第一个案例是更直接和有效的,因为它在堆栈上少了一个调用,但我相信更好的编码风格将两者结合起来。我认为这不会是你在班上使用这个变量的唯一地方。
public class Test {
public static final int A = 1234;
public static int getA()
{
return A;
}
public static int doSomething()
{
int result = A * 10;
//do more stuff
return result;
}
}
这使您只能在一个地方更改变量,如果它需要更改并在整个程序中获得预期结果。就个人而言,我会将int A设为私有,只是为了使用get方法的一致性,这就是必须如何设置类。这样你就不会遇到一个问题,你不记得在变量名之后是否需要'()',并且以相同的方式访问类外的所有变量。大多数这只是编码风格,而不是对或错。