2013-06-18 2 views
2

Я перерабатываю старый код и нахожу класс «Тэги», содержащий строковые константы, большинство из которых теги, используемые некоторыми обработчиками XML-Parser-Handlers. Но и для сериализации данных. Они определены пустым:константы строки инициализации отражением

public static String PROXY, NAME, X, Y, KEY, ... CODES;

и инициализируется своим собственным именем:

static { 
    Field[] fields = Tags.class.getFields(); 
    for (int i = 0; i < fields.length; ++i) { 
     try { 
      // init field by its lowercased name 
      String value = fields[i].getName().toLowerCase(); 
      fields[i].set(null, value); 
     } catch (Exception e) { 
      // exception should not occur, because only strings over here. 
      e.printStackTrace(); 
     } 
    } 
} 

Имеет ли смысл на ваш взгляд? Плюсы:

  • все теги в одном месте
  • гарантируется соответствие между именем & значением (без опечаток)
  • поддержки со стороны IDE автозавершения при вводе

Минусы:

  • не совсем постоянные (не окончательные)
  • читаемости - просто использовать строковые литералы «прокси», «имя» и т.д. будет более простым
  • инициализация отражения потребляет время обработки - задержки время запуска

Так - держать его или реорганизовать его?

+2

Я бы, вероятно, попытался использовать 'enum' для этого. – Pshemo

+0

Мальчик это очень напоминает значения ENUM. Почему бы не понять способ использования ENUM с этими значениями? –

ответ

3

Попробуйте это:

enum Enum { 
    PROXY, NAME, X, Y; 
    public String toString() { 
     return name().toLowerCase(); 
    } 
} 

или это:

public enum Tags { 
    proxy, name, x, y 
} 
+0

спасибо, Михаил! Я преобразовал строки в перечисления. Хорошая идея перегрузить 'toString()'. – kinnla

4

Вы можете заменить эти константы на перечисление и сохранить преимущества вы перечисленные:

public enum Tags { 
    PROXY("proxy"), 
    NAME("name"), 
    X("x"), 
    Y("y"); 

    public final String value; 

    private Tags(String value) { 
     this.value = value; 

     if (!value.equals(name().toLowerCase())) { 
      throw new RuntimeException("Value and name do not match"); 
     } 
    } 

    public static void main(String[] args) { 
     for (Tags tag : Tags.values()) { 
      System.out.println(tag + "\t" + tag.value); 
     } 
    } 
} 

В приведенной выше коде, тест value.equals(name().toLowerCase()) не является необходимым, но вы озаботились опечатки ошибок

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