Булевы значения редко встречаются в бизнесе и промышленности
По моему опыту создания пользовательских приложений для бизнеса, очевидная двойственность, такая как «Женский / Мужской» или «Вкл. / Выкл.», Почти всегда эволюционирует или трансформируется в несколько значений.
- «Женский / Мужской» становится «Неизвестный / Женский / Мужской»
- «Вкл. / Выкл.» Становится «Вкл. / Прогрев / Охлаждение / Выкл.»
Бизнес-правила часто не полностью известны на раннем этапе или меняются со временем.
Как и многие мои коллеги, я научился трудному способу никогда не определять такие значения как булевы.Переход от логических значений к множественным значениям позже довольно дорог и рискован.
Перечисления Java
Перечисления имеют другие преимущества по сравнению с булевыми.
Перечисления Java являются гибкими и мощными
Возможность Enum
в Java гораздо более эффективнагибкий, мощный и полезный, чем перечисления в большинстве других языков.См. Oracle Tutorial .
В вашем определении enum вы можете разместить представления значений для представления пользователю и для хранения в базах данных или файлах.Это позволяет программисту в одном окне прочитать все об этом перечислении и о том, как оно используется в вашем приложении.
Вот полный пример.Этот класс показывает, какие значения мы используем в пользовательском интерфейсе и какие значения мы сохраняем.
package com.basilbourque.example;
public enum Status {
ACTIVE( "Active" , "active" ),
INACTIVE( "Inactive" , "inactive" ),
UNKNOWN( "Unknown" , "unknown" );
private String displayName, codeName;
Status ( String displayName , String codeName ) {
this.displayName = displayName;
this.codeName = codeName;
}
public String getDisplayName () { return this.displayName; } // Or even add a `Locale` argument to support localization.
public String getCodeName () { return this.codeName; }
// To find a `Status` enum object matching input retrieved from a database.
static public Status ofCodeName ( String codeName ) {
// Loop each of the enum objects to find a match.
for ( Status s : Status.values() ) {
if ( s.getCodeName().equals( codeName ) ) { return s; }
}
throw new IllegalArgumentException( "No such Status code name as: " + codeName );
}
@Override
public String toString() { return "app-status-" + this.getCodeName() ; }
}
Перевод постоянных значений обратно в объект перечисления
Обратите внимание на статический метод, который может вернуть объект Status
, соответствующий постоянному значению, полученному из базы данных:
Status s = Status.ofCodeName( myResultSet.getString( "code" ) ) ;
Гибкие наборы / карты
В Java перечисления имеют свои собственные реализации Set
и Map
, которые высоко оптимизированы как с точки зрения очень небольшого количества используемой памяти, так и с очень быстрым выполнением.
Set< Status > auditApprovedStatuses = EnumSet.of( Status.ACTIVE , Status.INACTIVE ) ;
Set< Status > auditAlertStatuses = EnumSet.of( Status.UNKNOWN ) ;
…
if( auditAlertStatuses.contains( application.getStatus() ) ) {
this.alertAuditor( application ) ;
}
Обратите внимание, как легко обновить эти определения наборов, если ваше определение статуса приложения изменяется.
Информативное toString
значение
В то время как логическое значение выглядит как true
или false
как строка, в вашем перечислении вы можете переопределить toString
, чтобы сгенерировать гораздо более информативное значение, такое как app-status-inactive
.
Такие значения могут быть весьма полезны при ведении журнала, трассировки или отладки.