【问题标题】:type conversion for user defined classes用户定义类的类型转换
【发布时间】:2011-04-02 18:28:28
【问题描述】:

我有很多基本等价的类,即在所有方面都有几乎相同的功能。我们称它们为 A 和 B。有数百种方法正在使用 A,现在由于代码更改,我必须将它们更改为 B。

有没有一种方法可以编写 A 和 B 之间的映射,从而使代码更改最少?

【问题讨论】:

  • 如果你澄清一下为什么你有这么多类似的类,以及什么样的情况需要你从 A 切换到 B,这可能会有所帮助。
  • 好吧,该项目是用 A 编写的,然后出现了一个更好的实现,用 B 管理它会更好、更容易,因为相对较小的部分(仍然在数千行 java 代码中)使用 A 因此我们需要一种在它们之间无缝转换的方法。代码更改最少

标签: java refactoring


【解决方案1】:

您可以将 A 设为 B.I.e. 的 adapter

class A {
   private B b = new B();

   public String someMethod() {
      return b.equivalentSomeMethod();
   }
}

如果方法相似,而不是完全相同。如果它们完全相同 - 使用您的 IDE 删除其中一个类并将其替换为另一个。

【讨论】:

  • 有什么理由比设置一些继承关系更可取?
  • 是的 - 我对此添加了评论。如果方法在某些方面有所不同(这是我最初的印象)
【解决方案2】:

如果A不是final,你可以制作B extends A,并拥有B的方法@OverrideA的方法。然后,无论您以前在 instanceof A 上调用方法,现在都提供一个 instanceof B,并让动态调度处理其余部分。

这称为多态性。它仅适用于具有相同确切签名的非static 方法。你不能@Overridestatic方法。

另见

相关问题


在接口上

根据您这样做的原因,您应该了解接口的概念以及如何在面向对象编程中使用它们以实现这种灵活性和便利性。

例如,考虑interface List<E> 和实现ArrayList<E>。如果您编写了一个使用ArrayList<E> 的整个库,执行所有通常的add/addAll/remove 等操作,而现在您必须使用LinkedList<E>,那么您别无选择,只能转到源代码并进行更改所有ArrayList<E>LinkedList<E>,并希望更改不会破坏仍然假定使用ArrayList<E> 的另一个代码。

如果您的库改为使用List<E>,则只需在创建对象的任何位置切换到LinkedList<E>。执行add/addAll/remove 的所有其他代码仍然可以正常工作,因为这些是在interface List<E> 中定义的所有实现者都将拥有的方法。

从目前的上下文看不清楚,但如果AB 如此相似,那么它们可能属于某种类型X。如果是这样,您应该考虑定义interface X,并拥有A implements XB implements X

另见

相关问题

【讨论】:

    【解决方案3】:

    方法有很多,各有优缺点。几个想法:

    使 B 成为 A 的子类型。然后您可以将 B 的实例传递给需要 A 的方法。或者,提取一个公共接口,并在可能的情况下用该接口替换 A 的使用(一个好的 IDE 可以自动执行此操作)。

    在 A 中,包含以下构造函数:

    A(B b) {
        // create an A with the data from b
    }
    

    或创建一个子类 A 并将所有调用委托给 B 的适配器。

    无论如何,如果您的目标是尽量减少更改代码的乏味,请查看您的 IDE 的重构操作。

    【讨论】:

    • +1 用于命名 both 解决方案,两者都有其用途,如果没有更多详细信息,我们不能推荐一个。
    【解决方案4】:

    您应该定义一个 A 和 B 都实现的接口。

    【讨论】:

    • +1。首先让 A 实现(我们称它为)I。现在让每个调用者使用 I,而不是 A。此时您的程序行为没有改变。现在,根据需要,您可以让 B 实现 I 并传入 B,随时进行测试。这比其他人建议的子类选项更干净。
    【解决方案5】:

    好吧,在这种情况下,您可能应该使用继承。

    如果您将B 设为A 的子类,则您可以在之前使用A 的任何地方使用B,而无需更改任何代码。

    Sun/Oracle 有 some great tutorials on inheritance,您可能需要查看一下以开始使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多