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

java子类或字段,良好的语义,java,field,subclass,semantics,Java,Field,Subclass,Semantics,请帮助我决定在以下情况下哪种方法是合理的。对象: public class FunctionCall { private String functionName; private List<Exp> args; ... } 公共类函数调用{ 私有字符串函数名; 私有列表args; ... } 在一个非常特殊的情况下/检查需要以某种方式识别对象。 可能的办法: FunctionCall类成为一个属性,但这无疑会污染整体语义,因为该属性不应该“全局”可见 SpecialF

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

public class FunctionCall {
  private String functionName;
  private List<Exp> args;
  ...
}
公共类函数调用{
私有字符串函数名;
私有列表args;
...
}
在一个非常特殊的情况下/检查需要以某种方式识别对象。 可能的办法:

  • FunctionCall
    类成为一个属性,但这无疑会污染整体语义,因为该属性不应该“全局”可见
  • SpecialFunctionCall
    继承了
    FunctionCall
    ,在非常特殊的情况下,可以通过
    instanceof
    识别。这将是理想的,唯一的疑问是它会滥用继承的目的吗
  • 欢迎提出任何其他建议

  • 提前感谢。

    从您编写的内容来看,
    FunctionCall
    对象似乎只是一个包含数据的值对象,而不是一个自行计算并返回值的对象。对于多种类型的此类对象,您需要有一种方法来消除您正在使用的对象类型的歧义

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

    public class FunctionCall {
        // ...
        public MyType getType() {
            return MyType.BASIC_FUNCTION_CALL;
        }
    }
    
    Enum的另一个优点是,它是一个可以有自己字段的类。为枚举常量设置一些
    final
    字段,输入描述其某些特性的值,您可以在处理它的逻辑中使用这些信息,这对您是有利的


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

    您实际需要的是使用Java的三个主要原则中的两个,
    多态性和“继承”结合在一起。多态性是OOPs特性之一,它允许我们以不同的方式执行单个操作。这意味着对象的行为可以根据特定的环境或情况而改变

    在本例中,您可以创建两个类,一个
    FunctionCall
    和一个
    SpecialFunctionCall
    。后者应
    扩展
    第一个对象及其一个特定行为。
    然后,当您的特殊情况出现时,您将使用第二个类,它将具有与第一个不同的行为

    通过这种方式,您可以保证父类
    FunctionCall
    具有每种情况的功能

    请参见下面的使用示例:

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

    使
    FunctionCall
    成为一个
    接口
    ,然后有不同的实现(
    DefaultFunctionCall
    SpecialFunctionCall
    )。这样你就不会滥用继承权。但是只需指定行为啊,您想在
    函数调用中使用
    instanceof
    ?我以为你会在别处做这件事,这就是我建议enum的原因。当然,您可以在其子类中重写
    FunctionCall
    的方法。由于您几乎没有提供任何代码来显示预期用途,因此我的回答无法非常准确地满足您的需求。