12

自分自身 (これ) を 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で次のことを行う必要があります:

  • 一方向の階層 (有向非巡回グラフ) にいる
  • 私のメソッドの1つ(正確にはイベントリスナーメソッド)で、私はここにいるのに最適なオブジェクトではないと判断しました。
  • 私は新しいオブジェクトを作成し (正確には私のクラスのサブクラスから)、自分自身を彼と交換し、近い将来ガベージコレクションされるようにします

要するに、Javaでどのように達成できますself become: (someClass new:someParameters)か? 使用できる既知の設計パターンはありますか?

4

3 に答える 3

5

最も一般的な形式では、任意のオブジェクト スワッピングを静的型付けと調和させることは不可能です。2 つのオブジェクトのインターフェイスが異なる可能性があるため、タイプ セーフが損なわれる可能性があります。オブジェクトのスワップ方法に制約を課すと、そのような機能をタイプ セーフにすることができます。このような機能は主流になることはありませんでしたが、研究で調査されています。代わりにGilgulを探してください。

密接に関連しているのは、オブジェクトのクラスを動的に変更する機能である再分類です。これは、いくつかのプリミティブを備えた Smalltalk で可能です。繰り返しになりますが、これは型の安全性を危険にさらし、主流になることはありませんでしたが、研究で調査されています. Wide ClassesFickle、またはPlaidを見てください。

オブジェクトのスワッピングに対する貧弱な解決策は、クライアントとスワップするオブジェクトの間に介在するプロキシ、または状態と戦略の設計パターンの使用です。

于 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 に答える