Единственное место я видел, что он полезен, - когда Вы пишете броский цикл, где Вы хотите сделать несколько вещей в одном из выражений (вероятно, 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, встроенный вместо того, чтобы объявить и затем инициализировать.... и тому подобное.)
Вам нужно будет где-то проделать эту итерацию из-за ограничений в написании перечислений. В идеале вы должны заполнить статическую карту из конструктора 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;
}
}
}
По крайней мере, вы не будете делать итерацию каждый раз, хотя я сомневаюсь, что вы заметите какое-либо существенное улучшение производительности.
Если строки известны во время компиляции и являются действительными идентификаторами, вы можете просто использовать их как имена перечислений напрямую:
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;
}
Насколько я знаю (чего бы это ни стоило), это лучший способ делать то, что вы хотите.
По крайней мере, так я бы сделал.
Если бы ваше количество перечисления
значительно увеличивается (пара сотен - тысячи), вы можете добавить отображение
из строк
в перечислений
для выполнения поиск немного быстрее. Но для того небольшого количества eunums
, которое у вас есть, это может быть излишним.
Мне кажется, это нормально.
Я бы оставил итерацию как есть. Конечно, вы можете добавить реализацию Map <'label', 'DocumentType'> в класс enum и выполнить поиск, но это не приведет к значительному увеличению производительности.