java子类或字段,良好的语义

时间:2017-11-13 13:02:29

标签: java field subclass semantics

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

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

在一个非常特殊的情况下/检查对象需要以某种方式识别。 可能的方法:

  1. FunctionCall类成为一个属性,但有人怀疑这会污染整体语义,因为该属性不应该是可见的&#34;全局&#34;。
  2. SpecialFunctionCall继承FunctionCallinstanceof可以在非常特殊的情况下识别。这将是理想的,唯一的怀疑是它会滥用继承的目的吗?
  3. 非常欢迎任何其他建议。
  4. 提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

关于枚举的另一个好处是,它是一个可以拥有自己的字段的类。有一些final字段用于枚举常量,放入描述它的某些特征的值,并且您可以在处理它的逻辑中使用此信息,这对您有利。

至于你问题的实际答案,对你的问题知之甚少是不可能的。在某些情况下,继承更好,在其他一些情况下,组合更好。在这两种情况下,某种界面都很好,它可以声明getType方法。

答案 1 :(得分:0)

你真正需要的是使用Java的两个主要三个原则,polymorphism和&#39;继承&#39;结合在一起。多态性是OOP功能之一,允许我们以不同的方式执行单个操作。这意味着可以根据特定情况或情况改变对象的行为。

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

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

见下面的使用示例:

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