java - 如何整合多个类,避免instanceof?

标签 java

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

                    ---->Constraint<--------------------
                    |                  |               |
                  FConstraint        PConstraint    TConstraint
                  |         |
            UConstraint AConstraint

基类 Constraint 是空的,TConstraint 也是。

UConstraintPConstraintAConstraint 共享三个变量。但是,UConstraintAConstraint 有一个 PConstraint 没有的额外变量。

我觉得我正试图用钳子敲破一堵砖墙。我的一个想法是提供一个抽象方法来约束签名:

// All answers are of type string.
abstract void setValue(string variable, string answer);

由每个 Constraint 子类实现。然而,传递一个字符串来确定要设置哪个变量似乎容易出错,并且有类似的糟糕代码味道。

第二个选项是将三个相似的变量向上移动到 Constraint 中,但这仍然留下了 UConstraint, AConstraint 我可能需要设置的额外信息。 TConstraint 不需要任何这些都无济于事。

我目前的蛮力“去他妈的这个设计。”解决方案是一个 instanceof 汤,我在其中检查并填写缺少的特定于约束的信息。

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.

这种设计有没有比抽象函数更好的解决方案?

最佳答案

你的问题没有足够的信息来说明你在每种情况下需要做的实际工作,但通常是这样的代码:

Object constraint = item.getConstraint();

if (constraint instanceof AConstraint) {
    // Work
} else if (constraint instanceof PConstraint) {
    // Work
} // etc.

使用起来味道很重polymorphism并重构为这样的东西:

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.      
  }
}

关于java - 如何整合多个类,避免instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725540/

相关文章:

java - 重新排序滚动 Pane 中的面板

java - 使用 smack 4.2.2 从 Openfire 服务器获取所有用户

java - 使用 Appengine 进行被动 FTP

java - Sonar 错误条件不应无条件评估为 "TRUE"或 "FALSE"

java - 处理 IllegalThreadStateException

java - 从应用程序控制整个系统音量?

java - 如何从命令提示符在不同位置运行多个 JAR 文件

java - 单例实现接口(interface)的优势

java - Hangman while 循环不适用于 ||

Java - 将 List<Double> 添加到 List<List<Object>>