мое Перечисление корректно?

Единственное место я видел, что он полезен, - когда Вы пишете броский цикл, где Вы хотите сделать несколько вещей в одном из выражений (вероятно, init выражение или выражение цикла. Что-то как:

bool arraysAreMirrored(int a1[], int a2[], size_t size)
{
  size_t i1, i2;
  for(i1 = 0, i2 = size - 1; i1 < size; i1++, i2--)
  {
    if(a1[i1] != a2[i2])
    {
      return false;
    }
  }

  return true;
}

Прощают мне, если существуют какие-либо синтаксические ошибки или если я смешался в чем-нибудь, что это не строгий C. Я не утверждаю, что, оператор является хорошей формой, но это - то, для чего Вы могли использовать его. В случае выше я, вероятно, использовал бы while цикл вместо этого так, несколько выражений на init и цикле будут более очевидными. (И я инициализировал бы i1 и i2, встроенный вместо того, чтобы объявить и затем инициализировать.... и тому подобное.)

5
задан Antoine Claval 30 July 2009 в 08:19
поделиться

4 ответа

Вам нужно будет где-то проделать эту итерацию из-за ограничений в написании перечислений. В идеале вы должны заполнить статическую карту из конструктора DocumentType, но это не разрешено.

Лучшее, что я могу предложить, - это выполнить итерацию один раз в статическом инициализаторе и сохранить перечисления в таблице поиска:

public enum DocumentType {

    .... existing enum stuff here

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>();
    static {
        for(DocumentType documentType : DocumentType.values()){
            typesByLabel.put(documentType.label, documentType);
        }
    }

    public static DocumentType getDocumentType(String label){
        if (typesByLabel.containsKey(label)) {
            return typesByLabel.get(label);
        } else {
            return UNKNOWN;
        }
    }
}

По крайней мере, вы не будете делать итерацию каждый раз, хотя я сомневаюсь, что вы заметите какое-либо существенное улучшение производительности.

5
ответ дан 14 December 2019 в 04:44
поделиться

Если строки известны во время компиляции и являются действительными идентификаторами, вы можете просто использовать их как имена перечислений напрямую:

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm }

, а затем получить их по .valueOf () . Например:

String label = "Asset";
DocumentType doctype;
try {
    doctype = DocumentType.valueOf(label);
} catch (IllegalArgumentException e) {
    doctype = DocumentType.Unknown;
}
1
ответ дан 14 December 2019 в 04:44
поделиться

Насколько я знаю (чего бы это ни стоило), это лучший способ делать то, что вы хотите.

По крайней мере, так я бы сделал.

Если бы ваше количество перечисления значительно увеличивается (пара сотен - тысячи), вы можете добавить отображение из строк в перечислений для выполнения поиск немного быстрее. Но для того небольшого количества eunums , которое у вас есть, это может быть излишним.

1
ответ дан 14 December 2019 в 04:44
поделиться

Мне кажется, это нормально.

Я бы оставил итерацию как есть. Конечно, вы можете добавить реализацию Map <'label', 'DocumentType'> в класс enum и выполнить поиск, но это не приведет к значительному увеличению производительности.

1
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: