Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何合并多个类并避免instanceof?_Java - Fatal编程技术网

Java 如何合并多个类并避免instanceof?

Java 如何合并多个类并避免instanceof?,java,Java,我帮助开发的程序应该输出几个动态生成的问题供用户回答。这些问题有不同的类型,并有相应的类约束,它们用用户给定的信息填充。我的问题是如何为不同的约束创建统一的行为 ---->Constraint<-------------------- | | | FConstraint PConstraint

我帮助开发的程序应该输出几个动态生成的问题供用户回答。这些问题有不同的类型,并有相应的类
约束
,它们用用户给定的信息填充。我的问题是如何为不同的约束创建统一的行为

                    ---->Constraint<--------------------
                    |                  |               |
                  FConstraint        PConstraint    TConstraint
                  |         |
            UConstraint AConstraint
由每个
约束
子类实现。然而,传递一个字符串来确定要设置哪个变量似乎容易出错,而且代码味道也很糟糕

第二个选项是将三个类似的变量向上移动到约束中,但这仍然会留下
UConstraint,AConstraint
需要设置的额外信息。
t约束
不需要这些约束,这是没有帮助的

我当前的强力“去死这个设计。”解决方案是一个
实例,我在其中检查并填写缺少的约束特定信息

Object constraint = item.getConstraint();

if (constraint instanceof AConstraint) {
    AConstraint constraint = (AConstraint) constraint;

    if (constraint.getValue() == null) {
        constraint.setValue(string);
    } else if (constraint.getKey() == null) {
        constraint.setKey(string);
    } // More of the same.
} else if (constraint instanceof PConstraint) {
    // As the above if() group.
} // etc.

这个设计有比抽象函数更好的解决方案吗

约束
中指定通用功能:您希望能够对
约束
对象(实际上可能是其中一个子类型的对象)执行的任何操作,您在
约束
中有一个用于该功能的方法,您可以在子类中覆盖该方法

对于那些功能没有意义的父类,可以使用普通(例如空)实现


通过这种方式,您无需关心对象的具体类,只需使用超类提供的工具即可执行以下操作:

public interface Constraint{}

public abstract class VariableConstraint implements Constraint 
{ 
  /* hold 3 shared variables here */
}

public class UConstraint extends VariableConstraint{}
public class PConstraint extends VariableConstraint{}
public class AConstraint extends VariableConstraint{}

public abstract class EmptyConstraint implements Constraint {}

public class TConstraint extends EmptyConstraint {}
Constraint constraint = item.getConstraint();
constraint.doWork(...);
public class AConstraint {
  public ... doWork(...) {
    if (getValue() == null) {
      setValue(string);
    } else if (getKey() == null) {
      setKey(string);
    } // More of the same.      
  }
}

约束作为接口。定义一个抽象类来扩展这个
约束
,它应该具有共享变量
UConstraint
AConstraint
应该扩展这个具有共享变量的抽象类。其余的类可以直接实现
约束
接口。代码的实例应该更改为

Constraint constraint = item.getConstraint();
constraint.doWork(..);
更好的设计通常是针对接口编写代码

使用此原则

在接口中编程,并封装在抽象类或接口中不断变化的行为

对于你上面给出的例子

界面约束

抽象类-FConstraint


具体类-PConstraint、TConstraint、UConstraint、AConstraint

您的问题没有足够的关于您在每种情况下需要执行的实际工作的信息,但通常这样的代码:

Object constraint = item.getConstraint();

if (constraint instanceof AConstraint) {
    // Work
} else if (constraint instanceof PConstraint) {
    // Work
} // etc.
是一种强烈的气味,需要使用并重构为类似以下内容:

public interface Constraint{}

public abstract class VariableConstraint implements Constraint 
{ 
  /* hold 3 shared variables here */
}

public class UConstraint extends VariableConstraint{}
public class PConstraint extends VariableConstraint{}
public class AConstraint extends VariableConstraint{}

public abstract class EmptyConstraint implements Constraint {}

public class TConstraint extends EmptyConstraint {}
Constraint constraint = item.getConstraint();
constraint.doWork(...);
public class AConstraint {
  public ... doWork(...) {
    if (getValue() == null) {
      setValue(string);
    } else if (getKey() == null) {
      setKey(string);
    } // More of the same.      
  }
}
其中,特定类的外观如下所示:

public interface Constraint{}

public abstract class VariableConstraint implements Constraint 
{ 
  /* hold 3 shared variables here */
}

public class UConstraint extends VariableConstraint{}
public class PConstraint extends VariableConstraint{}
public class AConstraint extends VariableConstraint{}

public abstract class EmptyConstraint implements Constraint {}

public class TConstraint extends EmptyConstraint {}
Constraint constraint = item.getConstraint();
constraint.doWork(...);
public class AConstraint {
  public ... doWork(...) {
    if (getValue() == null) {
      setValue(string);
    } else if (getKey() == null) {
      setKey(string);
    } // More of the same.      
  }
}

你对界面有什么看法?;)@用户1329572:不,不是我写的。我现在只是想改进他们的设计:PHello,谢谢你的回答!我发现我没有具体说明我必须做什么,这已经太晚了。约束只以我提到的变量的形式携带特定的信息。答案将填充约束的这些可能为空的成员变量之一。每个instanceof将对象强制转换为特定约束,并遍历每个字段,确定空字段。这有用吗?我添加了一个编辑,它也澄清了这一点。这并没有多大区别,但我已经用您自己的代码更新了我的示例。哦,我刚刚理解了这个概念。令人惊叹的。