1. Define an enumeration with constructors
Inspired by EnumMap 's comment using Object[] , I came up with this solution:
public enum EmergencyPriority { P1(BusinessCriticality.C1, EmergencyLevel.E1), P2(BusinessCriticality.C1, EmergencyLevel.E2, BusinessCriticality.C2, EmergencyLevel.E1), P3(BusinessCriticality.C1, EmergencyLevel.E3, BusinessCriticality.C2, EmergencyLevel.E2), P4(BusinessCriticality.C2, EmergencyLevel.E3, BusinessCriticality.C3, EmergencyLevel.E1), P5(BusinessCriticality.C3, EmergencyLevel.E2), P6(BusinessCriticality.C3, EmergencyLevel.E3, BusinessCriticality.C4, EmergencyLevel.E1), P7(BusinessCriticality.C4, EmergencyLevel.E2), P8(BusinessCriticality.C4, EmergencyLevel.E3); private static EmergencyPriority[][] PRIORITIES; private EmergencyPriority(BusinessCriticality c, EmergencyLevel l) { addPriority(l, c, this); } private EmergencyPriority(BusinessCriticality c, EmergencyLevel l, BusinessCriticality c2, EmergencyLevel l2) { addPriority(l, c, this); addPriority(l2, c2, this); } private static void addPriority(EmergencyLevel l, BusinessCriticality c, EmergencyPriority p) { if (PRIORITIES == null) { PRIORITIES = new EmergencyPriority[EmergencyLevel.values().length][BusinessCriticality.values().length]; } PRIORITIES[l.ordinal()][c.ordinal()] = p; } public static EmergencyPriority of(BusinessCriticality c, EmergencyLevel l) { return PRIORITIES[l.ordinal()][c.ordinal()]; } }
2. Define an enumeration and statically initialize the corresponding array
Another solution would be to have a simple enumeration without constructors and statically initialize an array of priorities, which allows them to be reordered as you see fit for reading:
import static com.package.BusinessCriticality.*; import static com.package.EmergencyLevel.*; public enum EmergencyPriority { P1, P2, P3, P4, P5, P6, P7, P8; private static EmergencyPriority[][] PRIORITIES = new EmergencyPriority[BusinessCriticality.values().length][EmergencyLevel.values().length]; private void define(BusinessCriticality c, EmergencyLevel e) { PRIORITIES[c.ordinal()][e.ordinal()] = this; } static { P1.define(C1, E1); P2.define(C1, E2); P2.define(C2, E1); P3.define(C1, E3); P3.define(C2, E2); P4.define(C2, E3); P4.define(C3, E1); P5.define(C3, E2); P6.define(C3, E3); P6.define(C4, E1); P7.define(C4, E2); P8.define(C4, E3); } public static EmergencyPriority of(BusinessCriticality c, EmergencyLevel e) { return PRIORITIES[c.ordinal()][e.ordinal()]; } }
And you can have the following JUnit test to ensure that EmergencyPriority has all the combinations if you extend BusinessCriticality or EmergencyLevel:
@Test public void testEnumCompletude() { for (BusinessCriticality c : BusinessCriticality.values()) { for (EmergencyLevel e : EmergencyLevel.values()) { assertNotNull(String.format("%s/%s combination was forgotten", c, e), EmergencyPriority.of(c, e)); } } }