与Smalltalk相当的Java变为:

use*_*016 11 java design-patterns smalltalk

有没有办法将自己(这个)与Java中的其他对象交换?

在Smalltalk我们可以写

Object subclass:myClass [
    "in my method I swap myself with someone else"
    swapWith:anObject [
        self become:anObject.
        ^nil
    ]
]

myClass subclass:subClass [
]

obj := myClass new.
obj swapWith:subClass new.
obj inspect.
Run Code Online (Sandbox Code Playgroud)

结果An instance of subClass显然是.

我需要在Java中做以下事情:

  • 我处于单向层次结构(有向无环图)
  • 在我的一个方法中(确切地说是事件监听器方法)我认为我不是最合适的对象,所以:
  • 我创建了一个新对象(确切地说,来自我的类​​的子类),与他交换,让自己在不久的将来被垃圾收集

那么,简而言之,我如何在Java中实现self become: (someClass new:someParameters)?我可以使用一些已知的设计模式吗?

ewe*_*nli 6

在最一般的形式中,任意对象交换不可能与静态类型相协调。这两个对象可能具有不同的接口,因此这可能会损害类型安全。如果对对象的交换方式施加限制,则可以使此类功能成为类型安全的。这种功能从未成为主流,但已在研究中进行了调查。而是在Gilgul寻找。

密切相关的是重新分类,即动态更改对象类的能力。这在 Smalltalk 中可以通过一些原语实现。同样,这使类型安全面临风险,从未成为主流,但已在研究中进行了调查。看看宽阶级变化无常格子图案

穷人对对象交换的解决方案是在客户端和要交换的对象之间插入代理,或者使用状态和策略设计模式。