首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化:全局字符串与调用Enum类

优化:全局字符串与调用Enum类
EN

Stack Overflow用户
提问于 2015-07-23 00:29:11
回答 2查看 81关注 0票数 0

我有这门课,

代码语言:javascript
复制
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;
    }
}

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

代码语言:javascript
复制
private static final String A = "A";

问题:

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

就效率而言,纯粹从优化的角度来看(不管优化的规模有多小),这将更有效率。

  • 要调用全局声明的变量,
  • 以下列方式调用enum类 Test.A.getTestCode();

还是一点关系也没有?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-23 00:40:33

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

代码语言:javascript
复制
String x = YourClass.A;

将被编译为

代码语言:javascript
复制
String x = "A";

如果

代码语言:javascript
复制
String x = Test.A.getTestCode();

在接收getTestCode()之前,您需要调用"A"

您可以使用javap -c命令检查它,这将允许我们查看我们类的编译版本。所以对于这样的代码

代码语言:javascript
复制
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显示

代码语言:javascript
复制
  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方法。

票数 3
EN

Stack Overflow用户

发布于 2015-07-23 00:36:37

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

代码语言:javascript
复制
Test testA = Test.A;

然后打电话

代码语言:javascript
复制
testA.getTestCode();

海事组织,虽然没有太大的区别,但是如果你只对一个变量这样做,那么使用枚举就不值得了。如果它是一个永远不会改变的值(看起来是这样的),那么使用最后一个变量可能会更好,因为它清楚地表明,值不应该更改。如果在声明的上方添加一条JavaDoc行,那么对于正在阅读您的代码的任何人来说,这一点就更加清楚了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31576236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档