Infos zu Attribute in einer Klasse speichern

Bitte aktiviere JavaScript!
Hallo zusammen,

ich möchte gerne für jedes Attribut in meiner Klasse weitere Infos speichern, sodass ich später darauf basierend Listen erstellen kann, die ich dann in der WebGUI verwenden kann. (z.B. alle Felder von der Klasse Kunde, inkl. Business Namen)

Das wären Infos wie:
  • fieldName; -> "CUSTOMER_NUMBER"
  • languageName -> "Kundennummer" (kommt später von einer message.property)
  • uniqueFieldName; -> "CUSTOMER_CUSTOMER_NUMBER"
  • ruleRelevant; -> true
  • List<EnumOpertor> operatorList; -> "NOT_EQUAL, CONTAINS"
  • String valueType; -> "TEXT"
Nun aber die Frage, wie mache ich das am Besten?
Ich habe nun in meiner Klasse "Customer" ein Enum angelegt:

Java:
public class Customer {

.....

public enum EntityField {

ACADEMIC_TITLE("ACADEMIC_TITLE", "Akademischer Titel", "ACADEMIC_TITLE", ValueType.TEXT, true), //

       private String fieldName;
        private Object fieldValue;
        private String languageName;

 
/////////////////////////

         private String uniqueFieldName;
        private boolean ruleRelevant;
        private List<String> operatorList;
        private String valueType;

        private EntityField(String fieldName, Object fieldValue, String languageName, String uniqueFieldName, String valueType,
               boolean ruleRelevant, List<String> operatorList) {
            this.fieldName = fieldName;
            this.fieldValue = fieldValue;
            this.languageName = languageName;
            this.uniqueFieldName = uniqueFieldName;
            this.ruleRelevant = ruleRelevant;
            this.operatorList = operatorList;
            this.valueType = valueType;
        }
}
}
Die Frage ist auch, wie erstelle ich in einer Zeile eine String-Liste und hänge dann mehrere Strings ein?

Ist das mit dem Enum so korrekt?
Ich frage auch in anderen Klassen direkt diese Felder ab:
if(Customer.EntityField.CUSTOMER_NAME.equals(....)

_____________
Prinzipiell möchte ich ebenfalls eine Lösung finden, mit welcher ich folgende (derzeit aufwändigen) Abfragen pro Feld vereinfachen kann.

1) Prüfen, ob die Bedingung stimmt.
-> Hier prüfen ich, ob der Wert von ObjectForCheck und dem Wert von RuleConditionComponent stimmt.
-> ObjectForCheck enthält eine Referenz auf Customer, welches hier geprüft wird.
-> RuleConditionComponent enthält ein Feld: value (oder auch valueDate, wenn es ein Date ist)
-> Prinzipiell möchte ich nicht dauernd die gleiche Abfrage für jedes Feld haben, sondern bestmöglich eine Schleife, in der ich dann eben die Felder prüfe.
- Die Idee ist, eine Schleife über die Enum Liste zu machen.
- Der Getter des jeweiligen Felds müsste ich dann aber entsprechend bekommen (bspw.: objectForCheck.getCustomer().getAcademicTitle())

Java:
    public static boolean customerCondition(ObjectForCheck objectForCheck, RuleConditionComponent ruleConditionComponent) {

        LOGGER.info("START customerCondition");

        if (objectForCheck.getCustomer() == null)
            return false;

        ///////////////////
        // ACADEMIC_TITLE
        ///////////////////
        if (ruleConditionComponent.getFieldName()
                .equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {

            if (objectForCheck.getCustomer().getAcademicTitle() == null)
                return false;

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.EQUAL.toString())) {
                if (objectForCheck.getCustomer().getAcademicTitle()
                        .equalsIgnoreCase(ruleConditionComponent.getValue())) {
                    return true;
                }
            }

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.NOT_EQUAL.toString())) {
                if (!objectForCheck.getCustomer().getAcademicTitle()
                        .equalsIgnoreCase(ruleConditionComponent.getValue())) {
                    return true;
                }
            }

            if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.CONTAINS.toString())) {
                if (objectForCheck.getCustomer().getAcademicTitle().toLowerCase()
                        .contains(ruleConditionComponent.getValue().toLowerCase())) {
                    return true;
                }
            }

            if (!ruleConditionComponent.getState()
                    .equals(RuleConditionComponent.ConditionState.NOT_CONTAINS.toString())) {
                if (!objectForCheck.getCustomer().getAcademicTitle().toLowerCase()
                        .contains(ruleConditionComponent.getValue().toLowerCase())) {
                    return true;
                }
            }
        }

Die nächste Methode, die ich derzeit für jedes Feld abfrage, liest mir den DatenTyp des Felds hinzu und gibt dann ein RuleConditionComponent Objekt zurück. Auch diese Abfrage lässt sich vereinfachen, indem ich eine Schleife über das ENUM mache und dann eben den ValueType dem RuleConditionComponent hinzufüge?

Java:
/**
     * CUSTOMER
     */
    public static Object createCustomerRuleCondition(Object object) {

        LOGGER.info("START createCustomerRuleCondition");
      
        RuleConditionComponent ruleConditionComponent = null;
        String fieldName = null;

        if (object instanceof RuleConditionComponent) {
            ruleConditionComponent = (RuleConditionComponent) object;
            if (ruleConditionComponent.getFieldName() == null)
                return null;
            else
                fieldName = ruleConditionComponent.getFieldName();
        }

        ///////////////////
        // ACADEMIC_TITLE
        ///////////////////
        if (fieldName.equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {

            if (object instanceof RuleConditionComponent) {
                ruleConditionComponent.setValueType(RuleConditionComponent.ValueType.TEXT.toString());
                ruleConditionComponent.setValueDate(null);
                ruleConditionComponent.setValue(null);

                return ruleConditionComponent;
            }

        }
Die letzte Methode ist das Hinzufügen des Operators (Contains, Equals...).
Auch hier wäre das Auslesen aus dem Enum die einfachste Möglichkeit...?

Java:
/**
     * CUSTOMER
     */
    public static List<ObjectForSearchList> createCustomerOperator(Object object, String languageCode) {

        List<ObjectForSearchList> list = new ArrayList<ObjectForSearchList>();

        if (object == null)
            return null;

        RuleConditionComponent ruleConditionComponent = null;
        String fieldName = null;

        if (object instanceof RuleConditionComponent) {
            ruleConditionComponent = (RuleConditionComponent) object;
            if (ruleConditionComponent.getFieldName() == null)
                return null;
            else
                fieldName = ruleConditionComponent.getFieldName();
        }

        ///////////////////
        // ACADEMIC_TITLE
        ///////////////////
        if (fieldName.equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {

            if (object instanceof RuleConditionComponent) {
                list.add(new ObjectForSearchList("Enthält", RuleConditionComponent.ConditionState.CONTAINS.toString()));
                list.add(new ObjectForSearchList("Enthält nicht",
                        RuleConditionComponent.ConditionState.NOT_CONTAINS.toString()));

                list.add(new ObjectForSearchList("Gleich", RuleConditionComponent.ConditionState.EQUAL.toString()));
                list.add(new ObjectForSearchList("Ist nicht gleich",
                        RuleConditionComponent.ConditionState.NOT_EQUAL.toString()));
                return list;
            }
        }

Am Ende soll sowas herauskommen:
-> Sobald man ein Feld wählt, wird die Liste von Operatoren aktualisiert, ebenfalls den Feldwert.
-> Feldwert ist i.d.R. NULL, kann aber zB bei einer Auswahl des Geschlechts vorbelegt sein (HERR, FRAU)
2019-08-13 09_44_40-testing123 – Agent.png

Hat jemand Tipps? Sorry, falls es zu viel Text ist :)
Danke für die Hilfe
 
Zuletzt bearbeitet:
Ich bin mir ehrlich gesagt noch nicht sicher, was du vor hast...


ich möchte gerne für jedes Attribut in meiner Klasse weitere Infos speichern, sodass ich später darauf basierend Listen erstellen kann, die ich dann in der WebGUI verwenden kann. (z.B. alle Felder von der Klasse Kunde, inkl. Business Namen)

Das wären Infos wie:
  • fieldName; -> "CUSTOMER_NUMBER"
  • languageName -> "Kundennummer" (kommt später von einer message.property)
  • uniqueFieldName; -> "CUSTOMER_CUSTOMER_NUMBER"
  • ruleRelevant; -> true
  • List<EnumOpertor> operatorList; -> "NOT_EQUAL, CONTAINS"
  • String valueType; -> "TEXT"
Das klingt tendenziell (solange es statisch erst) erstmal nach einfach nur Annotierten Attributen.
Wobei sich sowas wie fieldName und uniqueFieldName aus dem Namen des Felds und der Klasse ergibt, das ist auch ohne extra Annotation umsetzbar.
Ich habe nun in meiner Klasse "Customer" ein Enum angelegt:

Die Frage ist auch, wie erstelle ich in einer Zeile eine String-Liste und hänge dann mehrere Strings ein?

Ist das mit dem Enum so korrekt?
Ob der Enum korrekt ist, hängt davon ab, was er machen soll. Die Felder solltest du aber alle final machen, um auf Nummer sicher zu gehen.

Liste direkt erstellen ginge zB mit List.of oder varargs.

Prinzipiell möchte ich ebenfalls eine Lösung finden, mit welcher ich folgende (derzeit aufwändigen) Abfragen pro Feld vereinfachen kann.
Dazu gab's doch schon einen Thread mit Lösungsansätzen, oder meint das jetzt was völlig anderes?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben