强制子类在加载时执行某些操作

时间:2015-08-02 11:09:12

标签: java inheritance design-patterns reflection static

假设我想要一个这样的抽象类:

public abstract Operator {

    public int[] operands;

    public Operator(int[] operands) {
        this.operands = operands;
    }

    public abstract int getOperatorResult();
}

并且有些运营商会从中扩展出来:

public class Add extends Operator {

    public Add(int[] operands) {
        super(operands);
    }

    public int getOperatorResult() {
        return operands[0] + operands[1];
    }
}

一个OperatorCreator获取类似“1 + 1”的表达式并返回相应的Operator子类(在本例中为Add):

public class OperatorCreator {

    public static Operator getInstance(String expr) {
        ...
    }
}

主要问题: 我希望让其他人通过扩展Operator类来设计自己的运算符。并以多态方式使用其运算符。像这样的东西:

public class Main {

    public static void main(String[] args) {
        Operator op = OperatorCreator.getInstance("1-2");
        System.out.println(op.getOperatorResult());
    }
}

假设OperatorCreator知道Operator的子类的.class文件位于何处,并使用反射在运行时加载这些子类。 但是,OperatorCreator必须知道一件事:例如,当给出“1 + 1”时,它还必须知道这些子类的运算符符号以返回Add对象。所以任何Operator的子类都可以有一个静态方法:“getSymbol”返回运算符的符号。但有一个问题。如果某人扩展了Operator并且没有提供“静态getSymbol”,那么她的代码将成功编译,而不会为OperatorCreator提供一个机制来知道她的新Operator的子类的符号,并且它会导致运行时问题。而且我不想让getSymbol成为一个运算符的抽象方法来强制子类来实现它,因为我不想创建一个子类的实例来获取它的符号。如何强制子类在加载符号时注册它们?

1 个答案:

答案 0 :(得分:-1)

您可以扩展Operator类层次结构,使其具有每种符号类型的抽象子类,例如AddOperatorSubtractOperatorMultiplyOperator。现在,客户端通过选择要扩展的超类来为您提供运算符的类型。