Java相当于Smalltalk';s变成:

Java相当于Smalltalk';s变成:,java,design-patterns,smalltalk,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 ne

有没有一种方法可以将自己(这个)与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.
显然,结果是子类的一个实例

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

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

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

这是Java中的保留字,您不能覆盖它

您试图做的事情可以通过一个简单的引用来实现。您只需迭代(或遍历图形)并将指针更改为要激活的对象

考虑这一点:

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

 String longestWord = "";
 for (String s : stringList) {
     if (longestWord.length() < s.length()) {
         longestWord = s;
     }
 }
List-stringList=new-ArrayList();
//填写你的清单
字符串最长的单词=”;
用于(字符串s:stringList){
if(longestWord.length()

longestWord
正在指向另一个对象。

是官方论坛上一条有趣的线索。我相信对象封装与强类型的结合使得这个函数无法在Java中工作。另外,对于已经很慢的JVM,这可能会导致灾难…

在最普遍的形式中,任意对象交换不可能与静态类型相协调。这两个对象可能具有不同的接口,因此这可能会危及类型安全性。如果对如何交换对象施加约束,则可以使此类功能具有类型安全性。这种特征从未成为主流,但已经在研究中得到了研究。找一个替代品

与此密切相关的是重新分类,即动态更改对象类别的能力。这在使用一些原语的Smalltalk中是可能的。同样,这使类型安全面临风险,从未成为主流,但已在研究中进行了调查。看看,或者


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

我会添加一个间接层次。可以交换实现所需接口的对象的容器对象。与Smalltalk不同。使用简单的容器将是最简单的,例如,一个委托给“真实”对象的包装器,或者将替换逻辑放入DAG类本身。函数变为不改变指针,而是改变对象本身。调用Been不会丢失旧对象。因此,您首先获取一些数据,然后在不丢失任何数据的情况下更改其标识…这里您只是…重写。它应该是
reference
,而不是
指针
。Java没有指针。这是Java,它是这样工作的。作者还说:
我创建了一个新对象(确切地说是从我类的一个子类创建的),和他交换了我自己,让我自己在不久的将来被垃圾收集
当然,引用,抱歉(最近太多Objective-C了)。一定要交换对象,这是一个很好的例子。我觉得需要实际的been:函数,在这种情况下…如果没有适当的内存管理,这可能会占用大量内存..been:不只是做(伪代码)
tmp:=self。自我:=其他。其他:=tmp。
遍历整个图是无法完成的,因为在方法内部,我无法访问层次结构头部(图是定向的,只有一种方式)。谢谢,非常有趣的线程。简单的代理模式(如Smalltalk中的重载#doesNotUnderstand)对于这种情况很好,而不是变成:。