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

标签 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 对象。因此任何运算符的子类都可以有一个静态方法:“getSymbol”,它返回运算符的符号。但有一个问题。如果有人扩展 Operator 并且不提供“static getSymbol”,她的代码将成功编译,而无需为 OperatorCreator 提供了解其新 Operator 子类的符号的机制,这会导致运行时问题。我不想让 getSymbol 成为 Operator 的抽象方法来强制子类实现它,因为我不想创建子类的实例来获取它的符号。如何强制子类在加载时注册其符号?

最佳答案

您可以扩展 Operator 类层次结构,使其具有每个符号类型的抽象子类,例如 AddOperatorSubtractOperator乘法运算符。现在,客户端通过选择要扩展的父类(super class)来为您提供运算符的类型。

关于java - 强制子类在加载时执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31771263/

相关文章:

java - Gradle idea插件排除了其他子项目的传递依赖不排除

java - 使用方法引用将 List 类型 <Integer> 转换为 String[] 数组

javascript - Javascript 如何将值从 "super class"传递到 "child class"

C# 检查一个对象是否可以转换为另一个对象失败?

c++ - 允许在应用程序级别挂载的文件系统库

c++ - 扩展此 C++ 工厂实现的最佳方法?

java - 选择另一个微调器后更新微调器

java - 来自互联网的文件已损坏

java - 有没有办法在调用的时候不调用子类的方法?

language-agnostic - 如果工厂返回的对象是静态的,它仍然被认为是工厂吗?