
Originariamente inviata da
andbin
Puoi chiarire meglio o descrivere di più lo scenario? Da quello che vedo, mi sembra che ciascuna costante ha un nome e ha una "funzione" predicato di test.
Una tua enum estende implicitamente java.lang.Enum. La tua enum non è a sua volta estendibile perché per le regole del linguaggio una enum è concettualmente/implicitamente "final" e quindi non può essere estesa.
Il problema nasce perchè nel mio progetto vado a popolare l'intestazione delle colonne di una JTable con il pattern strategy, in base al parametro passato nel costruttore.
Questo pannello può essere utile per impiegati o clienti.
volendo riassumere i concetti di impiegato e cliente in una enum comune ho creato questa enum che comprende i campi che essi hanno in comune.
codice:
public class FieldsCommon implements IFormStrategy<String>{
public static DefaultListModel<String> model = new DefaultListModel<>();
public enum EnumFieldsCommon implements IFormField{
NOME("Nome", x -> x.length() > 1),
COGNOME("Cognome", x -> x.length() > 1),
CODICE_FISCALE("Codice fiscale", x -> x.length() == 15),
INDIRIZZO("Indirizzo", x -> x.length() > 7),
TELEFONO("Telefono", x -> isNumber(x)),
EMAIL("E-Mail", x -> Pattern.compile(EnumFieldsCommon.EMAIL_PATTERN).matcher(x).matches());
private static final String EMAIL_PATTERN =
"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
private String nomeCampo;
private Predicate<String> pred;
private EnumFieldsCommon(final String nomeCampo, final Predicate<String> pred){
this.nomeCampo = nomeCampo;
this.pred = pred;
}
@Override
public String getField() {
return this.nomeCampo;
}
@Override
public Predicate<String> getPred() {
return this.pred;
}
private static boolean isNumber(String s){
try{
return Optional.ofNullable(new Integer(s)).isPresent();//ritrona true se � riuscito a convertirlo, altrimenti ritorna false
} catch (NumberFormatException e){
return false;
}
}
}
@Override
public List<IFormField> getFields() {
return Arrays.asList(EnumFieldsCommon.values());
}
}
oltre a questi campi devo aggiungere per impiegati il campo salario e per i clienti il campo data scadenza.
La soluzione che ho pensato è questa, con la pecca della duplicazione di codice per quanto riguarda l'enum.
codice:
public class EmployeeStrategy implements IFormStrategy{
private FieldsCommon fieldsCommon;
public EmployeeStrategy() {
this.fieldsCommon=new FieldsCommon();
}
public enum EnumFieldsCommon implements IFormField{
SALARIO("Salario", Optional.empty());
private String nomeCampo;
private Optional<Predicate<String>> pred;
private EnumFieldsCommon(final String nomeCampo, final Optional<Predicate<String>> pred){
this.nomeCampo = nomeCampo;
this.pred = pred;
}
@Override
public String getField() {
return this.nomeCampo;
}
@Override
public Optional<Predicate<String>> getPred() {
return this.pred;
}
}
@Override
public List<IFormField> getFields() {
List<IFormField> list= fieldsCommon.getFields();
list.addAll(Arrays.asList(EnumFieldsCommon.values()));
return list;
}
}
Spero di essere stato abbastanza chiaro, grazie per l'aiuto