Reputation: 14711
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?
Upvotes: 6
Views: 22456
Reputation: 509
For creating immutable list of objects, from Java 9 you can use List.of static method. So you can create something like:
Enum1("a","b"),
Enum2("c","d")
private String fields;
EnumClassName(String...args) {
this.fields = List.of(args);
}
}
In the calling method you can call like
list = Enum1.fields;
Hoping this clears your understanding.
Upvotes: 0
Reputation: 4223
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
}
Upvotes: 19