优化:全局字符串与调用枚举类

时间:2015-07-23 00:29:12

标签: java string optimization enums

我有这个枚举类,

public enum Test {
    A("A"),
    B("B"),
    C("C"),
    D("D");

    private final String test;

    Test(final String test) {
        this.test = test;
    }

    public String getTestCode() {
        return stateCode;
    }
}

在单元测试类中,我声明了以下全局变量

private static final String A = "A";

问题:

在单元测试类中,多个测试将使用A的值。

为了提高效率,纯粹从优化的角度来看(无论优化程度有多小),哪种效率会更高

  • 调用全局声明的变量
  • 以下列方式调用枚举类

    Test.A.getTestCode();
    

还是没有任何区别?

2 个答案:

答案 0 :(得分:3)

private static final String A = "A";是编译时常量,其值将被内联,因此代码如

String x = YourClass.A;

将编译为

String x = "A";

如果是

String x = Test.A.getTestCode();

在收到getTestCode()之前,您需要致电"A"

您可以使用javap -c命令检查它,这将允许我们查看我们班级的编译版本。对于像

这样的代码
public class Demo {

    private static final String A = "A";

    void test1(){
        String x = Demo.A;
    }

    void test2(){
        String x = "A";
    }

    void test3(){
        String x = Test.A.getTestCode();
    }

}

javap -c Demo显示

  public com.stackoverflow.Demo();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return

  void test1();
    Code:
       0: ldc           #8                  // String A
       2: astore_1
       3: return

  void test2();
    Code:
       0: ldc           #8                  // String A
       2: astore_1
       3: return

  void test3();
    Code:
       0: getstatic     #22                 // Field Test.A:LTest;
       3: invokevirtual #27                 // Method Test.getTestCode:()Ljava/lang/String;
       6: astore_1
       7: return

这意味着方法test1test2实际上是相同的,而test3首先需要访问A枚举,然后调用其getTestCode方法。

答案 1 :(得分:0)

我很喜欢枚举,因为它们为你提供了更多的扩展潜力(比如Test.B和Test.C以及其他辅助函数),但为了清楚起见,你可能希望维护一个类变量:

Global.asax.cs

然后致电

Test testA = Test.A;
然而,IMO并没有什么区别,但是如果你只为一个变量做这个,那么使用枚举并不值得。如果它是一个永不改变的值(看起来似乎是这样),你可能最好使用最终变量,因为它清楚地表明该值永远不会改变。如果你在声明之上添加一个JavaDoc行,你可以让任何正在阅读你代码的人更清楚。