enum A {a,b,c}
enum B extends A {d}
/*B is {a,b,c,d}*/
के रूप में लिखा जा सकता है:
public enum All {
a (ClassGroup.A,ClassGroup.B),
b (ClassGroup.A,ClassGroup.B),
c (ClassGroup.A,ClassGroup.B),
d (ClassGroup.B)
...
- ClassGroup.B.getMembers () में {a, b, c, d} शामिल हैं
यह कैसे उपयोगी हो सकता है: मान लें कि हम कुछ चाहते हैं: हमारे पास ईवेंट हैं और हम एनम का उपयोग कर रहे हैं। उन एनमों को समान प्रसंस्करण द्वारा समूहीकृत किया जा सकता है। यदि हमारे पास कई तत्वों के साथ संचालन होता है, तो कुछ घटनाओं का संचालन शुरू होता है, कुछ बस कदम होते हैं और दूसरे ऑपरेशन को समाप्त करते हैं। इस तरह के ऑपरेशन को इकट्ठा करने और लंबे स्विच केस से बचने के लिए हम उन्हें उदाहरण और उपयोग के रूप में समूहित कर सकते हैं:
if(myEvent.is(State_StatusGroup.START)) makeNewOperationObject()..
if(myEnum.is(State_StatusGroup.STEP)) makeSomeSeriousChanges()..
if(myEnum.is(State_StatusGroup.FINISH)) closeTransactionOrSomething()..
उदाहरण:
public enum AtmOperationStatus {
STARTED_BY_SERVER (State_StatusGroup.START),
SUCCESS (State_StatusGroup.FINISH),
FAIL_TOKEN_TIMEOUT (State_StatusGroup.FAIL,
State_StatusGroup.FINISH),
FAIL_NOT_COMPLETE (State_StatusGroup.FAIL,
State_StatusGroup.STEP),
FAIL_UNKNOWN (State_StatusGroup.FAIL,
State_StatusGroup.FINISH),
(...)
private AtmOperationStatus(StatusGroupInterface ... pList){
for (StatusGroupInterface group : pList){
group.addMember(this);
}
}
public boolean is(StatusGroupInterface with){
for (AtmOperationStatus eT : with.getMembers()){
if( eT .equals(this)) return true;
}
return false;
}
// Each group must implement this interface
private interface StatusGroupInterface{
EnumSet<AtmOperationStatus> getMembers();
void addMember(AtmOperationStatus pE);
}
// DEFINING GROUPS
public enum State_StatusGroup implements StatusGroupInterface{
START, STEP, FAIL, FINISH;
private List<AtmOperationStatus> members = new LinkedList<AtmOperationStatus>();
@Override
public EnumSet<AtmOperationStatus> getMembers() {
return EnumSet.copyOf(members);
}
@Override
public void addMember(AtmOperationStatus pE) {
members.add(pE);
}
static { // forcing initiation of dependent enum
try {
Class.forName(AtmOperationStatus.class.getName());
} catch (ClassNotFoundException ex) {
throw new RuntimeException("Class AtmEventType not found", ex);
}
}
}
}
//Some use of upper code:
if (p.getStatus().is(AtmOperationStatus.State_StatusGroup.FINISH)) {
//do something
}else if (p.getStatus().is(AtmOperationStatus.State_StatusGroup.START)) {
//do something
}
कुछ और उन्नत जोड़ें:
public enum AtmEventType {
USER_DEPOSIT (Status_EventsGroup.WITH_STATUS,
Authorization_EventsGroup.USER_AUTHORIZED,
ChangedMoneyAccountState_EventsGroup.CHANGED,
OperationType_EventsGroup.DEPOSIT,
ApplyTo_EventsGroup.CHANNEL),
SERVICE_DEPOSIT (Status_EventsGroup.WITH_STATUS,
Authorization_EventsGroup.TERMINAL_AUTHORIZATION,
ChangedMoneyAccountState_EventsGroup.CHANGED,
OperationType_EventsGroup.DEPOSIT,
ApplyTo_EventsGroup.CHANNEL),
DEVICE_MALFUNCTION (Status_EventsGroup.WITHOUT_STATUS,
Authorization_EventsGroup.TERMINAL_AUTHORIZATION,
ChangedMoneyAccountState_EventsGroup.DID_NOT_CHANGED,
ApplyTo_EventsGroup.DEVICE),
CONFIGURATION_4_C_CHANGED(Status_EventsGroup.WITHOUT_STATUS,
ApplyTo_EventsGroup.TERMINAL,
ChangedMoneyAccountState_EventsGroup.DID_NOT_CHANGED),
(...)
ऊपर अगर हमारे पास कुछ विफलता है (myEvent.is (State_StatusGroup.FAIL)) तो पिछली घटनाओं से पुनरावृत्ति होने पर हम आसानी से जाँच कर सकते हैं कि क्या हमें धन हस्तांतरण वापस लेना चाहिए:
if(myEvent2.is(ChangedMoneyAccountState_EventsGroup.CHANGED)) rollBack()..
यह इसके लिए उपयोगी हो सकता है:
- प्रसंस्करण तर्क के बारे में एक्साइटिक मेटा-डेटा सहित, कम याद रखना
- बहु विरासत में से कुछ को लागू करना
- हम वर्ग संरचनाओं का उपयोग नहीं करना चाहते हैं, पूर्व। लघु स्थिति संदेश भेजने के लिए