我有这个枚举类,
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();
还是没有任何区别?
答案 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
这意味着方法test1
和test2
实际上是相同的,而test3
首先需要访问A
枚举,然后调用其getTestCode
方法。
答案 1 :(得分:0)
我很喜欢枚举,因为它们为你提供了更多的扩展潜力(比如Test.B和Test.C以及其他辅助函数),但为了清楚起见,你可能希望维护一个类变量:
Global.asax.cs
然后致电
Test testA = Test.A;
然而,IMO并没有什么区别,但是如果你只为一个变量做这个,那么使用枚举并不值得。如果它是一个永不改变的值(看起来似乎是这样),你可能最好使用最终变量,因为它清楚地表明该值永远不会改变。如果你在声明之上添加一个JavaDoc行,你可以让任何正在阅读你代码的人更清楚。