4 Stimmen

Umstrukturierung von Code mit 'instanceof' zu einer überladenen Methode in Java

Ich habe dieses Stück Code aus GWT in Action:

public void processOperator(final AbstractOperator op) {
        System.out.println("Wordt deze ooit aangeroepen?");
        if (op instanceof BinaryOperator) {
            if ((data.getLastOperator() == null) || (data.isLastOpEquals())) {
                data.setBuffer(Double.parseDouble(data.getDisplay()));
                data.setInitDisplay(true);
            } else {
                data.getLastOperator().operate(data);
            }
            data.setLastOperator(op);
        } else if (op instanceof UnaryOperator) {
            op.operate(data);
        }

        data.setLastOpEquals(false);
}

Ich möchte den "instanceof"-Teil eliminieren, indem ich Methoden-Dispatching verwende:

public void processOperator(final BinaryOperator op) {
    if ((data.getLastOperator() == null) || (data.isLastOpEquals())) {
        data.setBuffer(Double.parseDouble(data.getDisplay()));
        data.setInitDisplay(true);
    } else {
        data.getLastOperator().operate(data);
    }
    data.setLastOperator(op); 
    data.setLastOpEquals(false);
}

public void processOperator(final UnaryOperator op) {
    op.operate(data);
    data.setLastOpEquals(false);
}

Aber jetzt stoße ich im folgenden Code der Klasse ButtonOperator auf Probleme. Der folgende Code hat AbstractOperator als Typ im Konstruktor. Der Code für die Typen UnaryOperator und BinaryOperator würde genau gleich aussehen, so dass es etwas umständlich ist, für diese Typen spezielle Konstruktoren zu erstellen, die genau den gleichen Code enthalten. Was ist ein besserer Ansatz?

public ButtonOperator(final CalculatorController controller,
        final AbstractOperator op) {
        super(op.label);

        this.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                controller.processOperator(op);
            }

        });
        this.setStyleName(CalculatorConstants.STYLE_BUTTON);
    }

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