2

たとえば、このコードは有効ですか?

class abc{
    int x,y;
    abc(int x,int y){
        this.x=x;
        this.y=y;
        while(true)
            update();
    }

    public void update(){
        x--;
        y--;
        if(y==0)
            this=null;
    }
 }

上記が無効な場合は、その理由を説明してください。特定の反復の後に存在しなくなるクラスが必要です。上記のアプローチの代替案を提案してください。

4

5 に答える 5

7

いいえ、このコードは無効です。

さらに、それが有効である場合にどのような意味のあるセマンティクスがあったのかわかりません。

上記のアプローチの代替案を提案してください。

オブジェクトへの参照がある限り、オブジェクトは存在します。オブジェクトをガベージコレクションの対象にするには、オブジェクトを指す参照がないことを確認する必要があります(この場合、これはyゼロに達するとすぐに発生するはずです)。

于 2012-05-16T10:53:04.090 に答える
5

いいえ。理由は、オブジェクトをnullにしないためです。あなたが言うときあなたは以前にオブジェクトへの参照を保持している変数obj = null;に置くだけです。null同じオブジェクトへの他の参照がおそらくたくさんあります。

あなたがやりたいのは、オブジェクトを無効にしてガベージコレクションにすることだと思いますが、この決定はクラス内で行います。これが問題である場合は、弱参照を調べることをお勧めします。

他の可能な解決策は、Javaで一種の「スマートリファレンス」を実装することです。SmartReferenceオブジェクトへの実際の参照を保持するクラスを作成できます。オブジェクトは、このスマート参照へのコールバックを保持しinvalidate()、構文的に間違った式のようなメソッドを呼び出す必要がありますthis = null。そのようなオブジェクトを直接参照するのではなく、スマートリファレンスを介してのみ参照するように注意する必要があります。

唯一の質問は「なぜあなたはこれをしたいのですか?」です。実際、これによりコードがより複雑で不安定になります。想像してみてください。オブジェクトはそれ自体を無効にすることを決定したので、「スマート参照」が保持している参照はになりnullます。これで、このスマート参照のすべての所有者は、オブジェクトを使用しようとしたときにNPEを取得します。これがまさにそのようなメカニズムがJavaに存在せず、アプリケーションプログラマーがメモリを直接管理できない理由です。

結論:すべてのオブジェクト参照を削除し、GCにその難しい仕事をさせます。信頼してください。ごみをきれいにすることを知っています。

于 2012-05-16T11:00:52.617 に答える
1

これは良い質問だと思います。構築後/構築中にオブジェクトが自分自身を検証し、理由が見つかった場合は、空の値を返すか、スタックに戻ってそのオブジェクトの作成をスキップする場合がたくさんあります。

ほとんどの場合、他の値のリストからオブジェクトのリストを作成する場合です。値がガベージであり、オブジェクトにこれを認識させたい場合。

次に、作成を検証するためにクラス自体の外部で関数をコーディングする必要があります。オブジェクトがそれを実行できるようにする方がはるかに便利です。

プログラマーがおそらくそれを台無しにしようとしていると仮定して、Javaがこのようなことを許可しないのは残念です。うまくコーディングすれば、それは素晴らしい機能になるでしょう。

于 2015-02-24T00:03:12.980 に答える
0

あなたが提案していることはJavaの概念としてさえ存在しないので、なぜこれをしたいのかを再考する必要があると思います。

変数はthis常にオブジェクト自体を参照します。オブジェクトを「無効化」することはできません。参照のみを無効にすることができます(結局のところ、実行しているのはnull、前のオブジェクトではなく、ポイントする参照を割り当てることです)。は常にスコープ内の現在のオブジェクトへのポインタであるため、thisこれを使用して行うのは意味がありません。

オブジェクトを強制的に破壊/ガベージコレクションさせようとしていますか?もしそうなら、あなたのコードの他の部分がまだそれへの参照を持っている間、あなたはそれをすることができません(そしてそれらが参照を持っていないなら、それはとにかくガベージコレクションされます)。

とにかく、これが何をすることを望み/考えましたか?

于 2012-05-16T10:54:08.577 に答える
0

コードはコンパイル時エラーになる必要があります。

The left-hand side of an assignment must be a variable

thisキーワードの変数ではありません。

this=null;
于 2012-05-16T11:01:43.070 に答える