【问题标题】:Java comparing interface using == operatorJava 使用 == 运算符比较接口
【发布时间】:2019-12-19 19:16:36
【问题描述】:

我有一个 ViewModel,它从数据库中检索一些对象,而其他一些类观察它们并将它们放入 UI。

为了与数据库交互,我需要更多信息,所以我最终创建了两个接口,一个更通用,另一个专门用于数据库

public interface MyObject{
    // Some methods ...
}

public interface MyObjectEntity extends MyObject{

   public int databaseSpecificMethod();

   // Some more of those ...

}

现在 ViewModel 有一个 MyObjectEntity 类型的列表,并提供插入新对象或修改现有对象的方法。

然后从 ViewModel 获取这些对象的类会将它们获取为 MyObject,我这样做是为了抽象出这些对象来自数据库的事实,这样它们就可能来自任何地方。

当 UI 类将其中一个对象发送到 ViewModel 时,它会将其发送为 MyObject 但是 ViewModel 需要将其作为 MyObjectEntity 来存储它(以防修改对象)。

我想到的一个解决方案是将给定的MyObjectMyObjectEntity 的列表进行比较,并使用== 进行比较,因为两者实际上应该是同一个实例。 (忽略遍历列表的成本)

是否有理由认为这是一种不好的做法或将来会带来问题?

另一种解决方案可能是将这些对象公开为MyObjectEntity 并忘记所有这些,在这种情况下,我想知道您是否认为抽象实际上没有意义并且不需要。 (目前检索这些对象的唯一方法是从数据库中)

【问题讨论】:

  • 你能用instanceof来检查它是否是MyObjectEntity对象吗?见stackoverflow.com/questions/13487765/…
  • @Progman 嗯...我知道instanceof 通常是一种代码味道,我宁愿避免它。但是,您让我认为我的解决方案是一种隐含的instanceof,但它并没有真正比较对象的类型,只要它是相同的实例或不是任何类型的对象
  • 那么请edit 在您的问题中包含对 ViewModel 和 UI 类的详细描述、它们如何与 MyObjectMyObjectEntity 接口一起使用以及您想要做什么。提供某种图表来可视化不同类的访问,并尽可能显示您拥有的源代码(类似于minimal reproducible example)。

标签: java software-design


【解决方案1】:

然后从 ViewModel 获取这些对象的类会将它们作为 MyObject 获取,我这样做是为了抽象出这些对象来自数据库的事实,这样它们就可能来自任何地方。

如果你真的开始设计你的系统,对象可以来自任何地方,那么你最好在MyObject 接口中创建一个通用方法,然后在MyObjectEntity 中调用private 覆盖它databaseSpecificMethod().

在这种情况下,您将利用多态性 (https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) 和一种开闭原则。

使用通用接口,然后使用instanceof 以某种方式以不同方式处理该接口的一个子类型,如果您最终得到类似的东西,可能会导致额外的代码更改

if (obj instanceof Interface1) { // you save into database

} else if (obj instaceof Interface2) { // you save into text file 

} else if .....

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多