与Smalltalk相当的Java变为:

时间:2013-08-14 12:10:33

标签: 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.

结果显然是An instance of subClass

我需要在Java中执行以下操作:

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

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

3 个答案:

答案 0 :(得分:4)

在最常见的形式中,任意对象交换都无法与静态类型协调。这两个对象可能具有不同的接口,因此这可能会危及类型安全。如果对如何交换对象施加约束,则可以使这种特征类型安全。这样的特征从未成为主流,但已经在研究中进行了调查。请改为Gilgul

密切相关的是重新分类,即动态更改对象类的能力。这可以在Smalltalk中使用一些原语。同样,这使得类型安全处于风险之中,从未成为主流,但已经在研究中进行了调查。查看Wide ClassesFicklePlaid

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

答案 1 :(得分:3)

Here是官方论坛上的一个有趣话题。我相信对象强制与强类型结合使得这个函数无法在Java中工作。加上已经很慢的JVM,这可能导致灾难......

答案 2 :(得分:-1)

this是Java中的保留字,您无法覆盖它。

您尝试做的事情可以通过简单的参考来实现。您只需迭代(或浏览图表)并将指针更改为您想要激活的内容。

考虑一下:

 List<String> stringList = new ArrayList<String>();
 // fill your list

 String longestWord = "";
 for (String s : stringList) {
     if (longestWord.length() < s.length()) {
         longestWord = s;
     }
 }

longestWord现在指向另一个对象。