使用'instanceof'将一些代码重构为Java中的重载方法解决方案

Mic*_*ent 4 java refactoring overloading

我有来自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);
}
Run Code Online (Sandbox Code Playgroud)

我想通过使用方法分派来消除'instanceof'部分:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是现在我在ButtonOperator类的代码中遇到了麻烦.以下代码将AbstractOperator作为构造函数中的类型.类型UnaryOperator和BinaryOperator的代码看起来完全相同,因此为它们制作包含完全相同代码的特殊构造函数感觉有点麻烦.什么是更好的方法?

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);
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 6

不幸的是,这不起作用.当您重载方法时,根据参数表达式的静态类型,在编译时决定调用哪一个.例如:

UnaryOperator uop = new UnaryOperator(...);
AbstractOperator aop = uop;

...

// This will call the "unary" version of the method
processOperator(uop);

// This will call the "abstract" version of the method
processOperator(aop);
Run Code Online (Sandbox Code Playgroud)

只有在重写方法时才会调用方法调用的运行时调度.