8

通常のオブジェクトを削除する場合と同じようにアプローチしました。つまり、参照をnullにして、ガベージコレクターにその仕事を任せます。

ただし、クラス内でnullと同等にする場合、オブジェクトへの唯一の参照は「this」です。したがって、次のクラスのコードは有効です。

class A{
  public A(){
    //Init
  }

  public void method destruct(){
    if(someCondition){
      this=null;  //Is this statement valid? Why / Why not?
    }
  }
}
4

14 に答える 14

18

Javaではオブジェクトを「破壊」しません。これは間違っています。しないでください。

オブジェクトはJavaのヒープ上に作成されます。それらを指す参照がある限り、それらは生きます。ガベージコレクターは混乱をクリーンアップします。

参照を不必要に蓄積して保持しないように、できる限りのことを行う必要があります(Swingのリスナーなど)。

しかし、あなたの提案はまったく正しいものではありません。停止し、やめます。

于 2012-06-11T12:46:12.210 に答える
11
this=null;  //Is this statement valid? Why / Why not?

thisは左辺値ではないため、有効なJavaではありません。つまり、割り当てることができるものではありません。これは、コンパイルエラーと同じよう42 = i;に、コンパイルエラーです。

(JLSは、代入について次のように述べています。 「代入演算子の最初のオペランドの結果は変数である必要があります。そうでない場合、コンパイル時エラーが発生します。」 - JLS 15.26.1 JLSテキストは、さまざまなものをリストします。変数としての資格thisがあり、それらの1つではありません。)

その上、duffymoが言うように、Javaで行うことは完全に間違った方向に進んでいます。GCに任せてください。

于 2012-06-11T12:50:31.480 に答える
3

注:あなたが提案することは、役に立たない可能性が非常に高いです。

できることは、委任を使用することです。

class A {
   private AImpl impl = new AImpl();

   public void close() {
      if (impl != null)
         impl.close();
      impl = null;
   }
}

すべての参照は間接的であるため、実際のオブジェクトへの参照が1つだけであることを確認して、それをクリアできます。


一部のOSGiコンテナーのプロキシーは、コンポーネントがアンロードされるときにこれを実行します。コンテナは参照のライフサイクルをほとんど制御できないため、ライブラリ(実装)をアンロードすることは困難になります。

于 2012-06-11T12:48:46.910 に答える
1

あなたの目標は深く誤った方向に進んでいます。

インスタンスの外部の誰かが、インスタンスへの非弱参照を保持しています。そうすれば、あなたが内部で何をしても、それは収集されません。または、誰もしません。そうすれば、内部で何をしても、最終的には収集されます。どちらの場合this=nullでも、それが合法的なJavaコードであったとしても、違いはありません。しないでください。オブジェクトの存続期間とメモリの枯渇が心配な場合は、削除したいオブジェクトの外側を見てください。

于 2012-06-11T12:48:30.070 に答える
1

設定this = nullは、オブジェクトがそれ自体を参照していないと言おうとするようなものです。常に暗黙的に自分自身を参照します。これを参照している可能性のある他のオブジェクトを見つけて、代わりにそれらの参照をクリアする必要があります。ほとんどのオブジェクトはスタック上にあるローカル変数を介して保持されるため、通常、これは自動的に行われます。私が「保持されている」と言うときは、それらが参照のチェーンを介して参照され、最終的にスタック上の変数につながることを意味します。メソッドを終了すると、参照がクリアされます。ただし、このオブジェクトを参照する静的変数がある場合は、明示的にnullに設定する必要があります。

于 2012-06-11T12:48:56.813 に答える
0

Javaガベージコレクタがクラスを取得するには、他のクラスを参照しないでください。

this=null;代入の左側は変数でなければならないため、このステートメントは不正です。

于 2012-06-11T12:48:27.873 に答える
0

deleteJavaで特定の参照を明示的に指定する方法はありません。Javaは、参照のハングを回避するためにこれを行います。オブジェクトを参照している場合delete、他のオブジェクトがそのオブジェクトを参照すると、データへのアクセスを試みて、無効なデータへの参照を取得する可能性があります。

deleteとにかくオブジェクトを作成しようとしてはいけません。オブジェクトへのすべての参照をnullに移動するだけです。

于 2012-06-11T12:48:45.803 に答える
0

いいえ。インスタンスオブジェクトへの参照がない場合、インスタンスオブジェクトはGCによって削除される可能性があります。つまり、実行中のすべてのスレッドからのインスタンスオブジェクトは、オブジェクトまでナビゲートできませんでした。メソッドを実行しているオブジェクト内にいる場合、このメソッドは外部から呼び出されるため、オブジェクトへの参照があります。オブジェクトへの参照はまだ外部に残っているため、オブジェクト自体を破棄することはできません。

メモリ管理の別のアプローチを検討してください。

于 2012-06-11T12:48:52.903 に答える
0

メソッドthisでは、現在のメソッドが呼び出されるオブジェクトへの参照であるため、変更できないようにする必要があります。これを最終的な参照と考えてください。

于 2012-06-11T12:49:01.200 に答える
0

オブジェクトのライフサイクルはJVMによって支配されます。このため、オブジェクトは、それ自体が不要になった時期を判断できません。あなたができることは、このオブジェクトへの参照にいくらかの努力を払うことです。オブジェクトの「重要性」を示すために、参照のタイプを使用できます。

Javaでの参照の基本的なタイプは、次の場所にあります。

詳細はこちら:http ://docs.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html

ここでの参照に関する議論: Javaのソフト参照と弱参照の違いは何ですか? Javaの参照クラスの理解と 理解:SoftReference、WeakReference、およびPhantomReference

于 2012-06-11T12:51:10.043 に答える
0

あなたは呼び出すことができます:

 System.gc() or RuntimeUtil.gc() from the jlibs

しかし、そうすると、JVMランタイムが台無しになります。参照をnullに設定すると、オブジェクトはまだ存在し、その参照だけはこのオブジェクトを参照せず、次にGCが呼び出されるときに、オブジェクトを破棄します(他の参照が参照しない限り)。

于 2012-06-11T12:56:54.223 に答える
0

上記のコードは無効です。クラスの参照thisは、JVMが実行されている間だけ持続します。設定は実際にはthis == nullコンパイラエラーを引き起こします。これは、参照と呼ばれますが、実際には値であり、値this何も割り当てることができないためです。

thisまた、実行がそのコード内にあり、GCがまだ実行中のオブジェクトを要求できない場合にのみ有効であるため、不要です。ただし、オブジェクトの実行が終了するとすぐに、thisも失われ、オブジェクトは自動的にGCで使用できるようになります(つまり、オブジェクトへの他の参照が存在しない場合)。

于 2012-06-11T13:01:39.710 に答える
0

これはコンパイルエラーです。'this'にNULLを割り当てることはできません。キーワード「this」は、equalsの右側で使用できます(左手がNULLでないことを除いて。理由:nullには何も割り当てることができません)。

破壊については、Javaで、舞台裏でこの仕事をすることができるGCがあります。

ユーザー定義オブジェクトの場合でも、次のようなことができることに注意してください-

object reference = null;

ただし、「this」はequalsの左側では使用できません。

于 2012-06-11T13:05:55.000 に答える
0

実行スレッドがdestruct()メソッド内にあるまさにその理由は、クラスAのこのインスタンスへの参照を保持している呼び出し元があることを示しています。したがって、javaで「this=null」のようなことはできません。 Javaで許可されていたとしても、役に立たなかったでしょう。Javaのオブジェクトを破棄することはできません。

于 2013-06-25T02:16:34.130 に答える