java 子类或字段,语义良好

java subclass or field, good semantics

请帮助我决定在以下情况下哪种方法是合理的。对象:

public class FunctionCall {
  private String functionName;
  private List<Exp> args;
  ...
}

在一个非常特殊的 case/check 中,需要以某种方式识别对象。 可能的方法:

  1. FunctionCall class 成为一个属性,但有人怀疑这会污染整体语义,因为属性不应该可见 "globally".
  2. SpecialFunctionCall继承了FunctionCall并且在非常特殊的情况下可以用instanceof来标识。这样就很理想了,唯一怀疑会不会滥用继承的目的?
  3. 非常欢迎任何其他建议。

提前致谢。

从你写的来看,FunctionCall 对象似乎只是一个带有数据的值对象,而不是一些评估自身和 returns 值的对象。对于多种类型的此类对象,您需要有一种方法来消除您正在使用的对象类型的歧义。

对于那部分,我建议您使用枚举来消除歧义,而不是使用 instanceof 运算符或 class 反射。您也可以用它创建漂亮的 switch-case 命令。

public class FunctionCall {
    // ...
    public MyType getType() {
        return MyType.BASIC_FUNCTION_CALL;
    }
}

枚举的另一个好处是,它 class 可以有自己的字段。为枚举常量设置一些 final 字段,放入描述其某些特征的值,然后您可以在处理它的逻辑中使用此信息,这对您有利。

不过,至于您问题的实际答案,由于对您的问题知之甚少,不太可能。在某些情况下,继承更好,在另一些情况下,组合更好。在这两种情况下,某种接口都很好,它可以声明 getType 方法。

你真正需要的是将Java、polymorphism和'inheritance'三个主要原则中的两个结合起来使用。多态性是 OOP 的特征之一,它允许我们以不同的方式执行单个操作。这意味着对象的行为可以根据特定情况或情况而改变。

在您的情况下,您可以创建两个 class,一个 FunctionCall 和一个 SpecialFunctionCall。后者应该 extends 第一个具有特殊行为的。
然后,当您的特殊情况出现时,您将使用第二个 class ,它的行为与第一个不同。

通过这种方式,您可以保证父项具有每个案例的功能 class FunctionCall

见下面的使用示例:

public class SpecialFunctionCall extends FunctionCall{
  //your special logic goes here
  ...
}