2 Stimmen

Konstante spezifische Methode mit Enums OR Refection ? Aufrufen von Methoden auf der Grundlage von Strings

Ich habe DTOs (Data Transfer Objects) an das DAO (Data Access Object) gesendet.

DTO hat eine Identifizierungszeichenfolge.

Auf der Grundlage dieser Zeichenfolge (bzw. des DTO) möchte ich bestimmte Methoden in der DAO aufrufen.

Diese Methoden führen Datenbankaufrufe durch.

Ich habe zwei Möglichkeiten gefunden, dies zu tun: 1. Konstante spezifische Methodenimplementierung mit Enum 2. Aufrufen der Methode auf der Grundlage von Reflexion (in diesem Fall trägt das DTO den Namen der Methode, die aufgerufen werden muss).

Ich möchte wissen, welche Option besser ist. Gibt es noch andere Alternativen? Ist es in Ordnung, Datenbankaufrufe innerhalb der Enum.

Die verwendete Programmiersprache ist Java.

1voto

ziesemer Punkte 26796

Ich würde keine Datenbankaufrufe innerhalb Ihrer Enum setzen. Stellen Sie stattdessen eine Methode in Ihrem DAO bereit, die das DTO akzeptiert, und lassen Sie diese Methode dann andere Methoden innerhalb des DAO auf der Grundlage der Zeichenfolge im DTO aufrufen. Sie könnten eine Switch-Anweisung für die Enum verwenden und dies sehr effizient gestalten. (Alternativ können Sie diese Implementierung in einer separaten "Adapter"-Klasse unterbringen, da man argumentieren könnte, dass dieser Code auch nicht unbedingt in das DAO gehört).

Ich würde auch Reflection vermeiden, vor allem wegen der zusätzlichen Komplexität - auch bei der Fehlersuche und -behebung - sowie wegen möglicher Sicherheitsbedenken. (Was wäre, wenn der String einen Methodennamen enthielte, der nicht aufgerufen werden soll?)

1voto

buc Punkte 6098

Sie können eine Map erstellen, die die Zeichenketten den Methodenaufrufen zuordnet:

class YourDAO {

    private interface Action {
        public void perform();
    }

    private Map<String, Action> actions;

    public YourDAO() {
        actions.add("String1", new Action() {
            public void perform() {
                daoMethod1();
            }
        }
        actions.add("String2", new Action() {
            public void perform() {
                daoMethod2();
            }
        }
    }

    public void daoMethod1() {
        ...
    }

    public void daoMethod2() {
        ...
    }

    public void doSomethingWithDTO(YourDTO dto) {
        actions.get(dto.getIdentifier()).perform();
    }

}

Sie können diese Idee sogar anpassen, um bestimmte Aktionen für verschiedene DTO-Typen durchzuführen, wenn Sie den Schlüsseltyp der Map ändern in Class<?> und anstelle von dto.getIdentifier() verwenden. dto.getClass() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X