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)
...
- ক্লাসগ্রুপ.বি.জেটমেমবার্স () এ {এ, বি, সি, ডি contains রয়েছে
এটি কীভাবে কার্যকর হতে পারে: ধরা যাক আমরা এর মতো কিছু চাই: আমাদের ইভেন্ট রয়েছে এবং আমরা এনাম ব্যবহার করছি। এই এনামগুলিকে অনুরূপ প্রক্রিয়াকরণ দ্বারা গোষ্ঠীভুক্ত করা যেতে পারে। যদি আমাদের অনেক উপাদান দিয়ে অপারেশন হয়, তবে কিছু ইভেন্টগুলি অপারেশন শুরু করে, কিছু কেবল পদক্ষেপ এবং অন্যটি অপারেশন শেষ করে। এই জাতীয় ক্রিয়াকলাপটি সংগ্রহ করতে এবং দীর্ঘ স্যুইচ ক্ষেত্রে এড়াতে আমরা উদাহরণ হিসাবে তাদের গ্রুপ করতে পারি এবং ব্যবহার করতে পারি:
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()..
এটি এর জন্য কার্যকর হতে পারে:
- প্রসেসিং লজিক সম্পর্কে এক্সক্লুসিট মেটা-ডেটা সহ, মনে রাখার মতো কম
- কিছু বহু-উত্তরাধিকার বাস্তবায়ন
- আমরা ক্লাস স্ট্রাকচার ব্যবহার করতে চাই না, প্রাক্তন। সংক্ষিপ্ত স্থিতির বার্তা প্রেরণের জন্য