java - 根据输入类型做出决策

标签 java oop

public class Main {
    public static void main(String[] args) {
        DataStructure s = new DataStructure();
        Input in = new Input();
        Data x = null;
        while ((x = in.readNext()) != null) {
            if (x instanceof InsertData) {
                s.insert((InsertData)x);
            } else if (x instanceof QueryData) {
                System.out.println(s.query((QueryData)x));
            }
        }
    }
}

Input 读取用户输入并使用方法 Data readNext()Data 的形式返回。

Data 可以是 InsertDataQueryData (它们也有不同的字段,即要插入的数据形式与查询不同)。

我想做的是读取Data并对DataStructure s执行插入/查询,具体取决于Data的类型由 readNext() 返回。

上面的代码是我针对这个问题的简单解决方案,但它使用转换和instanceof,这不是一个很好的编码风格。您能提出更好的解决方案吗?

我想到的另一个解决方案是在Data中使用一个方法void PerformAction(DataStructure s),该方法将被InsertData覆盖/QueryData并对DataStructure执行相应的操作,但我认为它不必要地将DataStructureData绑定(bind),这不会'也不是一个好的风格。意思是,我想将输入和执行操作分开,因为读取数据和用数据做一些事情是不同的事情。

最佳答案

将方法 performAction(Data) 添加到类 DataStructure
然后将抽象方法performOperation()添加到类Data中。
重写 InsertData 类和 QueryData 类中的 performOperation() 方法。
DataStructure 类中的方法 performAction(Data) 如下所示:

public void performAction(Data x) {
    x.performOperation();
}

你的while循环(在你的方法main()中)将是:

while ((x = in.readNext()) != null) {
   s.performAction(x);
}

关于java - 根据输入类型做出决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61557395/

相关文章:

c++ - 在 C++ 中构建带有对象存储库的工厂?

javascript - 将其传递给 jQuery 插件

javascript - 我怎样才能在 OOP 方面做得更好?

java - AndEngine加载图形: Where Do I put my assets folder and my resources?

JavaScript 对象定义属性和最大值

java - Equals 和 HashCode 执行流程

java - 启动时启动服务 : why it doens't work?

java - 使用默认方法解析字符串

java - 如何在不使用 java 表的 id 属性的情况下迭代表并在 <td> 标记中获取数据

java - 如何在不重新启动服务器的情况下刷新更新的实体数据