使用返回常量值的方法

时间:2012-10-05 17:44:33

标签: java

我们真的需要Java中的静态最终常量吗?

假设我有以下代码:

public class Test {

    public static final int A = 1234;

    public static int getA()
    {
        return 1234;
    }
}

您能否在效率方面比较以下两种情况?

  1. Test.A

  2. Test.getA()

5 个答案:

答案 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方法的一致性,这就是必须如何设置类。这样你就不会遇到一个问题,你不记得在变量名之后是否需要'()',并且以相同的方式访问类外的所有变量。大多数这只是编码风格,而不是对或错。