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

Java 强制子类在加载时执行某些操作,java,inheritance,design-patterns,reflection,static,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 Main { public static void main(Str

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

public abstract Operator {

    public int[] operands;

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

    public abstract int getOperatorResult();
}
public class Main {

    public static void main(String[] args) {
        Operator op = OperatorCreator.getInstance("1-2");
        System.out.println(op.getOperatorResult());
    }
}
一些运营商将从中扩展,如:

public class Add extends Operator {

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

    public int getOperatorResult() {
        return operands[0] + operands[1];
    }
}
以及运算符Creator,它获取类似“1+1”的表达式并返回相应运算符的子类(在本例中为Add):

主要问题是: 我想让其他人通过扩展操作符类来设计自己的操作符。并以多态方式使用它们的运算符。大概是这样的:

public abstract Operator {

    public int[] operands;

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

    public abstract int getOperatorResult();
}
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对象的运算符符号。因此,任何操作符的子类都可以有一个静态方法:“getSymbol”,它返回操作符的符号。但有一个问题。如果有人扩展了运算符,但没有提供“static getSymbol”,那么她的代码将成功编译,而不会为OperatorCreator提供了解新运算符子类的符号的机制,这将导致运行时问题。我不想让getSymbol成为一个抽象的操作符方法来强制子类实现它,因为我不想为了得到它的符号而创建子类的实例。如何在加载子类时强制子类注册其符号?

您可以扩展
运算符
类层次结构,使其具有每个符号类型的抽象子类,例如
添加运算符
减法运算符
多重运算符
。现在,客户机通过选择要扩展的超类来为您提供运算符的类型。

如果您的JDK是版本8,那么在Java 8中,接口可以有静态方法,也可以有具有默认实现的可重写方法。但它们仍然不能有实例字段。这些功能是lambda表达式支持的一部分。但是如果您的JDK<8,那么我将正常使用接口,并将静态方法更改为实例onesThanks,以获取关于JDK 8的这些有趣信息。但我的程序将在较旧的JRE上运行@拉米诺说,这个方法不应该是静态的,“我不想创建子类的实例”。您计划如何在不创建子类实例的情况下调用getOperatorResult方法?getInstance方法必须创建适当的实例。我知道这并不能回答您的问题,但无论如何,不创建子类的实例在这里不是一个选项。看看我的答案。我说过我不想让自己创建一个实例来调用getSymbol@盛泰