if (isProductDeliverable) {
REQUIRED_FIELDS = Arrays.asList(new String[] { Fields.NAME, Fields.EMAIL, Fields.ADDRESS });
} else {
REQUIRED_FIELDS = Arrays.asList(new String[] { Fields.NAME, Fields.EMAIL });
}
Instead of this, I want to have a predefined enum with two fields - REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS
and REQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS
I know the theory of enums but I've never used them so I cant figure out a way how to do this.
Or maybe a way to ask for the required fields by passing this "isProductDeliverable" boolean and get the correct array of fields?
Enums can have data and behaviour much like classes. Something like this should work...
public enum RequiredFields {
REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS( Fields.NAME, Fields.EMAIL, Fields.ADDRESS ),
REQUIRED_FIELDS_FOR_DOWNLOADABLE_PRODUCTS( Fields.NAME, Fields.EMAIL );
private List<String> fields;
private RequiredFields(String... fields){
this.fields = Arrays.asList(fields);
}
public List<String> getFields(){
return fields;
}
}
Further improvement:
In above code, the fields
property is still mutable. Someone could do REQUIRED_FIELDS_FOR_DELIVERABLE_PRODUCTS.getFields().add(..)
which would beat the whole purpose of having the enum
in the first place.
Better implementation for the constructor would be:
private RequiredFields(String... fields){
this.fields = ImmutableList.copyOf(fields); //com.google.common.collect.ImmutableList
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With