【问题标题】:Replace Java object instance with another and all references用另一个和所有引用替换 Java 对象实例
【发布时间】:2012-08-24 20:47:39
【问题描述】:

有没有办法将 java 中的一个对象替换为另一个更新对第一个对象的所有引用以指向第二个对象的方法?在 C# 中,这个问题在这里得到了回答:Replace object instance with another in C# 但我想知道我是否可以在 Java 中做到这一点。谢谢!

编辑: 1. 我想用子类型的对象替换第一个对象。 2. 我无法编辑第一个对象的实现,这就是我用子类型替换它的原因。我可以编辑子类型。

【问题讨论】:

  • 请问您为什么要这样做?场景是什么?
  • 这是关于改装游戏的。我想将一个类的实例替换为具有额外功能的子类,通过不修改基类来提高兼容性。
  • 请注意,您引用的 C# 方法也不允许您这样做。在那里,旧对象的状态完全被新对象的状态覆盖。

标签: java object


【解决方案1】:

即使可以,也不要这样做。相反,使用另一个类来包含或包装您要替换的对象。容器必须通过调用原始中的方法来实现原始所需的所有方法,但是您可以随时轻松替换包装的类。包装器、原始类以及您替换它的类都应该实现相同的接口。这个解决方案有点工作,但它会随着时间的推移而成立。

我怀疑你真正想要的是一个包含许多可升级组件的类,但这对于初学者来说是可行的,并让你以正确的方式思考。

【讨论】:

  • 他不想更改引用者的实现或原始实例的实现。
  • @DilumRanatunga 我可以更改新的实现,而不是原来的。
  • @DilumRanatunga:这里没有什么真正改变。一切都引用了包装器,这就像一个指向使它工作的类的指针。将容器内的 B 类交换为 A 类,现在容器(例如 C 类)看起来像 B 而不是 A 类。这类似于“依赖注入”。如果 A、B 和 C 都实现了相同的接口,那就是多态。每当我想在某事中间交换课程时,我都会这样做。我通常会在完成之前想出一个更好的解决方案,但这让我开始了。
  • @RalphChapin,为了使用这种技术,所有以前使用 A 的现有类现在都需要使用包装器。
  • @DilumRanatunga:是的。或者更好的是,界面。
【解决方案2】:

如果您的意图是用子类型替换特定类型的所有 个实例,那么您可以考虑使用java agents

使用它,您可以在类加载期间将基类替换为您的增强类。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2016-01-13
    • 2012-12-05
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多