Javaのデストラクタはありますか?


594

Javaのデストラクタはありますか?これに関するドキュメントを見つけることができないようです。ない場合、どうすれば同じ効果を達成できますか?

私の質問をより具体的にするために、私はデータを処理するアプリケーションを書いており、仕様では、アプリケーションを元の起動した状態に戻す「リセット」ボタンがあるべきだと述べています。ただし、アプリケーションが閉じているか、リセットボタンが押されていない限り、すべてのデータは「ライブ」である必要があります。

通常はC / C ++プログラマーなので、これを実装するのは簡単だと思いました。(したがって、最後に実装する予定でした。)リセットボタンが押されたときにすべての「ライブ」オブジェクトを破棄できるように、すべての「リセット可能な」オブジェクトが同じクラスにあるようにプログラムを構成しました。

データを逆参照してガベージコレクターがデータを収集するのを待つだけでよいのかと考えていましたが、ユーザーが繰り返しデータを入力してリセットボタンを押した場合、メモリリークは発生しませんか?また、Javaは言語としてかなり成熟しているので、これが起こらないようにする方法、またはこれに適切に取り組む方法があるはずだとも考えていました。


7
不要なオブジェクトへの参照を保持している場合にのみ、メモリリークが発生します。つまり、プログラムにバグがあります。それが必要としてGCは、(時には早く)を実行します
ピーターLawrey

17
オブジェクトを介してデータを迅速に処理している場合、仮想マシンはすぐにGCを実行しません。GCが常に追いつくことができる、または正しい決定をすることができるという考えは、誤りです。
キエーヴェリ2013年

1
@Kieveliエラーが発生する前に、JVMはGCを実行しませんか?
WVrock 2014年

4
ええ、Javaを1度に破壊するデストラクタがあったらいいですね。
トマーシュZato -復活モニカ

回答:


526

Javaはガベージコレクションされた言語であるため、オブジェクトが破棄されるタイミング(またはオブジェクトが破棄される場合でも)を予測することはできません。したがって、デストラクタに直接相当するものはありません。

と呼ばれる継承されたメソッドがありますが、finalizeこれはガベージコレクタの裁量で完全に呼び出されます。したがって、明示的に整頓する必要があるクラスの場合、規則はcloseメソッドを定義し、健全性チェックのみにfinalizeを使用することです(つまり、closeが呼び出されていない場合は、ここで実行してエラーをログに記録します)。

最近ファイナライズの詳細な議論を生み出した質問があっので、必要に応じてより深い情報を提供するはずです...


5
このコンテキストの「close()」は、java.lang.Autocloseableのメソッドを指しますか?
Sridhar Sarnobat 2013年

21
いいえ、AutoCloseableはJava 7で導入されましたが、 'close()'規約はずっと長くなっています。
Jon Onstott、2014年

オブジェクトが破棄されるタイミング(またはオブジェクトが破棄される場合でも)を予測できない理由。それを予測する他の近似方法は何ですか?
dctremblay 2016

@dctremblayオブジェクトの破棄はガベージコレクターによって行われ、ガベージコレクターはアプリケーションの存続期間中に実行されることはありません。
ピロ氏は2017

4
このfinalizeメソッド Java 9で非推奨になっていることに注意してください
Lii

124

見ていのtry-と、リソース文を。例えば:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  System.out.println(br.readLine());
} catch (Exception e) {
  ...
} finally {
  ...
}

ここで、不要になったリソースはBufferedReader.close()メソッドで解放されます。AutoCloseable同様の方法で実装して使用する独自のクラスを作成できます。

このステートメントはfinalize、コードの構造化の点でよりも制限されていますが、同時に、コードの理解と保守が簡単になります。また、finalizeアプリケーションのライブタイム中にメソッドが呼び出されるという保証はありません。


12
投票数が少ないのには驚きました。それが実際の答えです。
nurettin 2013年

20
それが実際の答えだとは思いません。複数のメソッド呼び出しにわたって、インスタンスがより長期間にわたって処理するリソースがある場合、try-with-resourcesは役に立ちません。一般的な事実ではなく、上記のメソッドが呼び出される速度で上記のリソースを閉じて再度開くことが問題でない場合。
Eric

14
実際、これは実際の答えではありません。オブジェクトの構築と使用がによって完全にカプセル化されtryfinallyがへの呼び出しを強制するために使用されない限り、この構造を使用してオブジェクトの破棄を管理することはできませんobj.finalize()。そして、このセットアップでも、OPによって引き起こされる問題を解決しません。「リセット」ボタンによってトリガーされるプログラムの途中でのオブジェクト破棄です。
7yl4r 2016

1
他のユーザーは、これがアプリケーションのエントリポイントで行われていることを示しています。変数をグローバルに定義します。エントリ関数で、tryを使用して初期化します。最終的にアプリケーションを閉じるときに初期化を解除します。それは完全に可能です。
TamusJRoyce

1
@nurettin Java 7は、質問がなされたときに3か月間しか出ていませんでした。
corsiKa

110

いいえ、デストラクタはありません。その理由は、すべてのJavaオブジェクトにヒープが割り当てられ、ガベージコレクションが行われるためです。明示的な割り当て解除(つまり、C ++の削除演算子)がない場合、実際のデストラクタを実装する賢明な方法はありません。

Javaはファイナライザをサポートしていますが、ソケット、ファイルハンドル、ウィンドウハンドルなどのネイティブリソースへのハンドルを保持するオブジェクトの保護手段としてのみ使用することを目的としています。ガベージコレクタがファイナライザなしでオブジェクトを収集すると、メモリにマークを付けるだけです。無料として地域とそれだけです。オブジェクトにファイナライザーがある場合、オブジェクトはまず一時的な場所にコピーされます(ここではガベージコレクションを実行していることに注意してください)。次に、ファイナライズ待ちのキューにエンキューされ、次にファイナライザースレッドが非常に低い優先度でキューをポーリングしますファイナライザを実行します。

アプリケーションが終了すると、JVMは保留中のオブジェクトがファイナライズされるのを待たずに停止するため、ファイナライザが実行される保証はありません。


4
ネイティブリソースについて言及していただきありがとうございます。これは、「デストラクタのような」メソッドが役立つ領域の1つです。
Nathan Osman 2013年

はい、私は現在、C ++へのネイティブ呼び出しを介して割り当てられたリソース/ハンドルを解放することで、同じ問題に直面しています。
nikk

@ddimitrov、理論的にはJavaは明示的な割り当て解除を実装できますか?それともこれは論理的な矛盾ですか?
ミル

1
@milsが明示的に割り当て解除を単純に実装すると、参照がライブオブジェクトを指しているというJavaの仮定が破られます。すべてのポインタを反復処理してエイリアスをnullにすることができますが、GCよりもコストがかかります。または、線形型システム(Rustの「所有権」を参照)を使用することもできますが、それは言語の大きな変更です。他のオプションもあります(JavaRTスコープのメモリなどを参照)。ただし、一般的に、明示的な割り当て解除はJava言語にうまく適合しません。
ddimitrov 2017

31

finalize()メソッドの使用は避けてください。これらはリソースのクリーンアップのための信頼できるメカニズムではなく、ガベージコレクターを乱用することによって問題を引き起こす可能性があります。

リソースの解放など、オブジェクトで割り当て解除の呼び出しが必要な場合は、明示的なメソッド呼び出しを使用します。この規則は既存のAPI(例:CloseableGraphics.dispose()Widget.dispose())で確認でき、通常はtry / finallyを介して呼び出されます。

Resource r = new Resource();
try {
    //work
} finally {
    r.dispose();
}

破棄されたオブジェクトを使用しようとすると、ランタイム例外がスローされます(IllegalStateExceptionを参照)。


編集:

データを逆参照してガベージコレクターがデータを収集するのを待つだけの場合、ユーザーが繰り返しデータを入力してリセットボタンを押すと、メモリリークが発生しないのではないかと考えていました。

一般的に、オブジェクトを逆参照するだけで済みます-少なくとも、これが動作するはずの方法です。ガベージコレクションが心配な場合は、Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning(またはJVMバージョンの同等のドキュメント)を確認してください。


1
それが逆参照が意味することではありません。これは「オブジェクトの最後の参照をnullに設定する」のではなく、参照から値を取得(読み取り)して、後続の操作で使用できるようにします。

1
try..finallyはまだ有効かつ推奨されるアプローチですか?以前にfinalize()でネイティブメソッドを呼び出していたとしたら、その呼び出しをfinally節に移動できますか? class Resource { finalize() { destroy(); } protected native void destroy(); } class Alt_Resource { try (Resource r = new Resource()) { // use r } finalize { r.destroy(); }
aashima

rのスコープはfinallyブロックにはなりません。したがって、その時点でdestroyを呼び出すことはできません。ここで、tryブロックの前にオブジェクトを作成するようにスコープを修正すると、醜い「before-with-resources」の前のケースになってしまいます。
userAsh

21

Java 1.7がリリースされたため、try-with-resourcesブロックを使用する追加オプションが利用できるようになりました。例えば、

public class Closeable implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("closing..."); 
    }
    public static void main(String[] args) {
        try (Closeable c = new Closeable()) {
            System.out.println("trying..."); 
            throw new Exception("throwing..."); 
        }
        catch (Exception e) {
            System.out.println("catching..."); 
        }
        finally {
            System.out.println("finalizing..."); 
        } 
    }
}

このクラスをc.close()実行すると、tryブロックが離れたとき、catchおよびfinallyブロックが実行される前に実行されます。finalize()メソッドの場合とは異なり、close()実行されることが保証されています。ただし、finally句で明示的に実行する必要はありません。


try-with-resourcesブロックを使用しなかった場合はどうなりますか?closeが呼び出されたことを確認するためだけに、finalize()でcloseを呼び出すことができると思います。
shintoZ 14

3
@shintoZ私が上記の回答を読んだとき、finalize()実行の保証はありません
Asif Mushtaq

14

ファイナライズの実行に依存しないように言って、私は他の答えに完全に同意します。

try-catch-finallyブロックに加えて、Runtime#addShutdownHook(Java 1.3で導入)を使用して、プログラムで最終的なクリーンアップを実行できます。

これはデストラクタと同じではありませんが、クリーンアップメソッド(永続的なデータベース接続を閉じる、ファイルロックを削除するなど)を呼び出すことができるリスナーオブジェクトが登録されたシャットダウンフックを実装できます- 通常はデストラクタ。繰り返しますが、これはデストラクタの代わりにはなりませんが、場合によっては、これで必要な機能にアプローチできます。

これの利点は、プログラムの他の部分と疎結合の振る舞いを持つことです。


addShutdownHookは明らかにJava 1.3で導入されました。とにかく、それは1.5で利用可能です。:)この参照:stackoverflow.com/questions/727151/...
skiphoppy

1
参考までに、私の経験では、Eclipseで赤い「終了」ボタンを使用した場合、シャットダウンフックは呼び出されません。JVM全体がすぐに破棄され、シャットダウンフックは正常に呼び出されません。つまり、Eclipseを使用して開発した場合、開発と本番の間に異なる動作が見られる可能性があります
Hamy

11

いいえ、java.lang.Object#finalizeあなたが得ることができる最も近いです。

ただし、呼び出された場合(および呼び出された場合)は保証されません。
見る:java.lang.Runtime#runFinalizersOnExit(boolean)


5
呼び出されてもされなくてもよいメソッドは、私の本では本質的に役に立たない。せいぜい誤った安心感しか与えない、役に立たない特別な方法で言語を汚染しない方がいいでしょう。Java言語の開発者がfinalizeが良いアイデアだと思った理由を私は決して理解できません。
2015

@antred Java言語の開発者は同意する。当時、彼らの一部にとって、ガベージコレクションを備えたプログラミング言語とランタイム環境を設計したのは初めてだったと思います。理解しにくいのは、他のマネージ言語がその概念を一度にコピーした理由です。この概念は悪い考えであると既に理解されていました。
Holger

7

まず、Javaはガベージコレクションされているため、オブジェクトの破棄について何かをする必要があることはまれです。1つは、通常、解放する管理リソースがないためです。2つ目は、いつ発生するか、または発生するかどうかを予測できないため、「誰も私のオブジェクトを使用しなくなった直後に」発生する必要があることには不適切です。 」

オブジェクトが破棄された後、java.lang.ref.PhantomReferenceを使用して通知を受けることができます(実際には、破棄されたことを示すのは少し不正確かもしれませんが、そのオブジェクトへのファントム参照がキューに入れられていると、回復できなくなり、通常は次のようになります。同じこと)。一般的な用途は次のとおりです。

  • 別のヘルパーオブジェクトに破壊する必要があるクラスのリソースを分離します(一般的なケースである、接続を閉じるだけの場合は、新しいクラスを記述する必要はありません。閉じられる接続は、その場合の「ヘルパーオブジェクト」になります。
  • メインオブジェクトを作成するときに、そのオブジェクトへのPhantomReferenceも作成します。これに新しいヘルパーオブジェクトを参照させるか、PhantomReferenceオブジェクトから対応するヘルパーオブジェクトへのマップを設定します。
  • メインオブジェクトが収集された後、PhantomReferenceがキューに入れられます(または、ファイナライザのようにキューに入れられる可能性があります。たとえば、VMが終了した場合、待機しないという保証はありません)。キューを処理していることを確認してください(特別なスレッドで、または時々)。ヘルパーオブジェクトへのハードリファレンスのため、ヘルパーオブジェクトはまだ収集されていません。ヘルパーオブジェクトで必要なクリーンアップを行ってから、PhantomReferenceを破棄すると、ヘルパーも最終的に収集されます。

finalize()もあり、これはデストラクタのように見えますが、デストラクタのようには動作しません。通常、これは適切なオプションではありません。


WeakReferenceではなくPhantomReferenceを使用する理由
uckelman、2011

2
@uckelman:必要なのが通知だけの場合、PhantomReferenceがその役目を果たします。これは、ほぼ設計された目的です。WeakReferenceの追加のセマンティクスはここでは必要ありません。また、ReferenceQueueに通知された時点で、WeakReferenceを介してオブジェクトを回復することはできません。そのため、このオブジェクトを使用する唯一の理由は、PhantomReferenceが存在することを覚えておく必要をなくすためです。WeakReferenceが行う追加の作業はおそらくごくわずかですが、なぜそれを気にするのですか?
Steve Jessop、2011

PhantomReferenceをほのめかしていただきありがとうございます。それは完璧ではありませんが、それでも何よりも優れています。
foo

@SteveJessop「余分な作業」は、ファントム参照と比較して弱い参照を持っていると思いますか?
Holger

6

finalize()この関数はデストラクタです。

ただし、GCの後で呼び出されるため、通常は使用しないでください。GCがいつ発生するかはわかりません。

さらに、を持つオブジェクトの割り当てを解除するには、複数のGCが必要finalize()です。

try{...} finally{...}ステートメントを使用して、コードの論理的な場所をクリーンアップする必要があります。


5

私はほとんどの答えに同意します。

finalizeまたはに完全に依存すべきではありませんShutdownHook

ファイナライズ

  1. JVMは、このfinalize()メソッドがいつ呼び出されるかを保証しません。

  2. finalize()GCスレッドによって一度だけ呼び出されます。オブジェクトがファイナライズメソッドから復活した場合、finalize再度呼び出されることはありません。

  3. アプリケーションでは、ガベージコレクションが呼び出されないライブオブジェクトがいくつかある場合があります。

  4. 任意のExceptionファイナライズメソッドによってスローされることは、GCスレッドによって無視されます

  5. System.runFinalization(true)およびRuntime.getRuntime().runFinalization(true)方法は、呼び出しの確率上げるfinalize()方法を今これらの2つの方法が推奨されなくなりました。これらのメソッドは、スレッドの安全性の欠如とデッドロックの作成の可能性があるため、非常に危険です。

shutdownHooks

public void addShutdownHook(Thread hook)

新しい仮想マシンのシャットダウンフックを登録します。

Java仮想マシンは、次の2種類のイベントに応答してシャットダウンします。

  1. 最後のデーモン以外のスレッドが終了したとき、またはexit(同等のSystem.exit)メソッドが呼び出されたときに、プログラムは正常に終了します。
  2. 仮想マシンは、^ Cの入力などのユーザー割り込み、またはユーザーログオフやシステムシャットダウンなどのシステム全体のイベントに応答して終了します。
  3. シャットダウンフックは、単に初期化されているが開始されていないスレッドです。仮想マシンがシャットダウンシーケンスを開始すると、登録されているすべてのシャットダウンフックが不特定の順序で開始され、同時に実行されます。すべてのフックが終了すると、finalization-on-exitが有効になっている場合は、呼び出されていないすべてのファイナライザが実行されます。
  4. 最後に、仮想マシンが停止します。exitメソッドを呼び出すことによってシャットダウンが開始された場合は、デーモンスレッド以外のスレッドも同様に、シャットダウンシーケンス中もデーモンスレッドは引き続き実行されることに注意してください。
  5. シャットダウンフックも、作業をすばやく終了する必要があります。プログラムが終了を呼び出すと、仮想マシンが即座にシャットダウンして終了することが期待されます。

    しかし、Oracleのドキュメントでさえ、

まれに、仮想マシンが異常終了する場合があります。つまり、完全にシャットダウンせずに実行を停止します

これは、仮想マシンが外部で終了した場合、たとえば、SIGKILLUnix のシグナルまたはTerminateProcessMicrosoft Windowsの呼び出しで発生します。たとえば、内部データ構造の破損や、存在しないメモリへのアクセスの試行などにより、ネイティブメソッドが失敗した場合も、仮想マシンが異常終了することがあります。仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかは保証されません。

結論ブロックを適切に使用しtry{} catch{} finally{}、重要なリソースをfinally(}ブロックで解放し ます。finally{}ブロック内のリソースの解放中、キャッチExceptionおよびThrowable


4

それがあなたが心配している単なる記憶であるならば、そうしないでください。ちょうどそれがまともな仕事をするGCを信頼してください。実際には、それが非常に効率的であるため、いくつかのインスタンスで大きな配列を使用するよりも、小さなオブジェクトのヒープを作成する方がパフォーマンスに優れているということがわかりました。


3

おそらく、try ... finallyブロックを使用して、オブジェクトを使用している制御フロー内のオブジェクトを確定できます。もちろん、それは自動的には起こりませんが、C ++での破壊も起こりません。finallyブロックでリソースのクローズがよく見られます。


1
これは、問題のリソースに単一の所有者がいて、他のコードによって「盗まれた」リソースへの参照がない場合の正しい答えです。
スティーブジェソップ

3

Lombokには@Cleanupアノテーションがあり、これは主にC ++デストラクタに似ています。

@Cleanup
ResourceClass resource = new ResourceClass();

処理時に(コンパイル時に)、実行が変数のスコープを離れると、Lombokは適切なtry-finallyブロックを挿入しresource.close()て呼び出されます。リソースを解放する別の方法を明示的に指定することもできます。例resource.dispose()

@Cleanup("dispose")
ResourceClass resource = new ResourceClass();

2
私が見る利点は、入れ子が少なくなることです( "破棄"を必要とするオブジェクトがたくさんある場合、これは重要かもしれません)。
アレクセイ

try-with-resourceブロックは、1回のショットで複数のリソースを持つことができます
Alexander-Reinstate Monica

1
しかし、それらの間で指示を持つことはできません。
Alexey 2018年

フェア。私は、複数のリソースの場合でも、try-with-resourceを優先することをお勧めします。ただし、リソース間で新しいtry-with-resourceブロックを作成するように強制する(ネストを増やす)必要がある場合を除き、使用する@Cleanup
Alexander-Reinstateモニカ

2

Javaのデストラクタに最も近いものはfinalize()メソッドです。従来のデストラクタとの大きな違いは、それがガベージコレクタの責任であるため、いつ呼び出されるかわからないということです。ファイルハンドルなどの一般的なRAIAパターンはfinalize()で確実に機能しないため、使用する前に注意深く読むことを強くお勧めします。


2

ここには多くの素晴らしい答えがありますが、finalize()の使用を避けるべき理由についての追加情報があります。

System.exit()またはが原因でJVMが終了した場合Runtime.getRuntime().exit()、デフォルトではファイナライザは実行されません。Runtime.exit()のJavadocから:

仮想マシンのシャットダウンシーケンスは、2つのフェーズで構成されます。最初のフェーズでは、登録されているすべてのシャットダウンフック(ある場合)が特定されていない順序で開始され、完了するまで同時に実行できます。2番目のフェーズでは、終了時のファイナライズが有効になっている場合、呼び出されていないすべてのファイナライザが実行されます。これが完了すると、仮想マシンが停止します。

あなたは呼び出すことができますSystem.runFinalization()が、それは「すべての未解決のファイナライズを完了するための最善の努力」をするだけで、保証ではありません。

System.runFinalizersOnExit()メソッドはありますが、使用しないでください。安全ではなく、ずっと前に廃止されました。


1

Javaアプレットを作成している場合は、アプレットの「destroy()」メソッドをオーバーライドできます。それは...

 * Called by the browser or applet viewer to inform
 * this applet that it is being reclaimed and that it should destroy
 * any resources that it has allocated. The stop() method
 * will always be called before destroy().

明らかにあなたが望むものでありませんが、他の人が探しているものかもしれません。


1

元の質問について考えてみてください...これは、他のすべての学習された回答と、Blochの本質的な効果なJavaの項目7「ファイナライザを回避する」から結論付けることができると思います。 Java言語には不適切です...:

...リセットが必要なすべてのオブジェクトを一種の「プレイペン」に保持するためにOPが実際に実行することを実行するためのかなり明白な解決策ではありません。アクセサーオブジェクトの...

そして、「リセット」する必要がある場合は、既存のベビーサークルを切断して新しいベビーサークルを作成します。ベビーサークル内のすべてのオブジェクトのウェブは漂流し、二度と戻らず、GCによって1日収集されます。

これらのオブジェクトのいずれかが存在するCloseable(または存在しないが、closeメソッドがある)場合は、オブジェクトがBag作成された(および開かれた可能性がある)ときに、それらをプレイペンに配置できます。すべてをCloseables閉じることで...?

コードはおそらく次のようになります。

accessor.getPlaypen().closeCloseables();
accessor.setPlaypen( new Playpen() );

closeCloseablesおそらく、特にJavaFXスレッドで、終了する必要のあるスレッドに固有のスレッド内の/ CountdownLatchを処理する(そして必要に応じて待機する)ために、おそらくラッチ(たとえば)を伴うブロッキングメソッドになるでしょう。RunnablesCallablesPlaypen


0

JavaのGCテクノロジーにはかなりの進歩がありましたが、それでも参照に注意する必要があります。実際にはラットの巣の下で巣になっている一見些細な参照パターンの多数の事例が頭に浮かびます。

あなたの投稿から、オブジェクトの再利用のためにリセットメソッドを実装しようとしているようには思えません(true?)。オブジェクトは、クリーンアップする必要がある他のタイプのリソースを保持していますか(つまり、閉じる必要があるストリーム、返される必要があるプールまたは借用オブジェクト)?あなたが心配している唯一のものがメモリの割り当て解除であるなら、私は私のオブジェクト構造を再検討し、私のオブジェクトがGC時にクリーンアップされる自己完結型の構造であることを確認しようとします。


0

Javaには正確なデストラクタクラスはありません。クラスはJavaでガベージコレクタによって自動的に破棄されます。しかし、以下を使用してそれを行うことができますが、まったく同じことではありません:

finalize()

finalizeの詳細な議論を引き起こした質問があっので、必要に応じてより深く理解する必要があります...


0

Javaにはデストラクタがありません。Javaの背後にある主な理由は、バックグラウンドで常にパッシブに動作するガベージコレクタであり、すべてのオブジェクトは、GCが動作する場所であるヒープメモリで作成されます。c++では、ガベージコレクターのようなものはないため、削除関数を明示的に呼び出す必要があります。


-3

以前は主にC ++を扱っていましたが、それがデストラクタの検索にもつながりました。今はJAVAをたくさん使っています。私がやったこと、それは誰にとっても最良のケースではないかもしれませんが、関数を使用してすべての値を0またはデフォルトにリセットすることにより、独自のデストラクタを実装しました。

例:

public myDestructor() {

variableA = 0; //INT
variableB = 0.0; //DOUBLE & FLOAT
variableC = "NO NAME ENTERED"; //TEXT & STRING
variableD = false; //BOOL

}

理想的には、これがすべての状況で機能するわけではありませんが、グローバル変数がある場合、大量の変数がない限り機能します。

私は最高のJavaプログラマーではないことはわかっていますが、私にとってはうまく機能しているようです。


あなたはそれがすべてのより多くの意味:)になります「これは取得」の後、より多くの不変オブジェクトを使用してみてください
R.バンTwisk

5
これは無意味であるため、それほど問題ではありません。つまり、何も実現しません。プログラムが正しく機能するために生の型をリセットする必要がある場合、クラスインスタンスのスコープは正しくありません。つまり、新しいObject()を作成せずに、既存のオブジェクトのプロパティを新しいオブジェクトのプロパティに再割り当てしている可能性があります。
simo.3792 14

1
ただし、変数をリセットする必要性はたくさんあります。それは私がやっていることに合うので、私はデストラクタという名前を選びました。それは何かを達成しますが、あなたが理解していることは何もありません
ChristianGLong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.