2015-07-23 3 views
0

У меня есть этот класс перечислимого,Оптимизации: Global Строка против вызова Enum Класс

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.

Для эффективности, чисто от перспектива оптимизации (независимо от того, насколько мал может быть оптимизация), который будет более эффективным

  • назвать глобально объявленную переменную,
  • , чтобы вызвать класс Enum следующим образом

    Test.A.getTestCode(); 
    

или это вообще не имеет значения?

+0

Что такое 'stateCode' в' getTestCode() '? – Pshemo

ответ

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.

0

Я фанат перечислений, потому что они дают вам больше возможностей для расширения (как Test.B и test.c и других вспомогательных функции), но для ясности вы можете поддерживать переменный класс:

Test testA = Test.A; 

а затем вызвать

testA.getTestCode(); 

ИМО, нет большой разницы, хотя, но если вы только делаете это для одной переменной, это на самом деле не стоит того, чтобы использовать перечисление. Если это значение, которое никогда не меняется (похоже, оно есть), вы, вероятно, лучше с конечной переменной, поскольку он дает понять, что значение никогда не должно меняться. Если вы добавите строку JavaDoc над объявлением, вы можете сделать это еще более понятным для всех, кто читает ваш код.

Смежные вопросы