12

有没有办法将自己(this)与 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)呢?我可以使用一些已知的设计模式吗?

4

3 回答 3

5

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

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

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

于 2013-08-22T06:22:12.057 回答
3

是官方论坛上的一个有趣的帖子。我相信对象封装与强类型的结合使这个功能无法在 Java 中工作。再加上已经很慢的 JVM,这可能会导致灾难......

于 2013-08-14T12:17:50.627 回答
-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现在指向另一个对象。

于 2013-08-14T12:17:45.547 回答