Gdzieś z tyłu głowy rozumiem, co tu się dzieje, bo to trochę, jak jakiś system sprzedażowy (ubezpieczenia, produkty finansowe) wygląda. W dodatku w jakiejś uproszczonej formie, bo masz tylko operator AND.
W ogólności masz tutaj do zamodelowania n-wymiarową tabelę, w której wypełnienie komórki uzależnione jest od jej współrzędnych.
- Każdy wariant to jedna oś.
- Każda wartość dla wariantu to wartość na danej osi.
- Każda oś może zawierać elementy tylko na przecięciu z niektórymi osiami.
IMO, zamiast enumów zdefiniuj jedną klasę, która reprezentuje wariant:
class Variant{
private final String name;
private final Set<Variant> validSubVariants;
public Variant(String name) {
this.name = name;
this.validSubVariants = new HashSet<>();
}
public Variant addSubVariant(Variant subVariant){
validSubVariants.add(subVariant);
return this;
}
public boolean containsSubVariant(Variant variant){
return validSubVariants.contains(variant);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Variant variant = (Variant) o;
return name.equals(variant.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
i niech ona sobie już ogarnia, co jej jest potrzebne. I wtedy dla twojego Variant2
masz na przykład:
//A("aaa", "aaaxxx"),
Variant aaa = new Variant("aaa");
Variant aaaxxx = new Variant("aaaxxx");
Variant A2 = new Variant("A2").addSubVariant(aaa).addSubVariant(aaaxxx);
//B("bbb", "bbbyyy"),
Variant bbb = new Variant("bbb");
Variant bbbyyy = new Variant("bbbyyy");
Variant B2 = new Variant("B2").addSubVariant(bbb).addSubVariant(bbbyyy);
//C("x"),
Variant x = new Variant("x");
Variant C2 = new Variant("C2").addSubVariant(x);
//Z("aaa")
Variant Z2 = new Variant("Z2").addSubVariant(aaa);
Jest to o tyle wygodne, że można zaczytać całą tablicę wariantów z pliku (mam dziwne wrażenie, że to jest jakaś wariacja jednego zadania z AoC 2020). Podobnie modelujesz Variant1
mając już zdefiniowane warianty drugiego i trzeciego poziomu.
I nie ma na to wzorca.