17

私はそれthis = nullが違法であることを知っています。

オブジェクト自体をクリーンアップする他の方法があるかどうか疑問に思っています。

私の望みは、次のようなことができるようになることです:

A a = new A();

a.doStuffAndDisappear();

if(a == null){
     //this is true after my doStuffAndDisappear() method.
}

これを実現する方法はないと思いますが、尋ねる価値があると思いました。

4

7 に答える 7

16

いいえ、a参照この質問のタイトルのようにオブジェクトaではない)であり、参照が定義されているメソッドを除いて、参照の値を変更できるメソッドはありません(ローカル変数であるコードコンテキストから推測します)。

Java には参照渡しがないため、あなたが求めることはできません。参照先のアドレスを管理するために参照のアドレスを収集する方法はありません。ラッパー オブジェクトを使用することもできますが、何がポイントになるかはわかりません。

于 2013-08-17T21:51:38.377 に答える
2

このきちんとした質問は、技術的に興味深いものです。nullただし、意図を考慮すると、期限切れのインスタンスの無効な使用を防ぐために、すべての参照の状態を強制しようとしています。

に何らかの意味を割り当てるのは悪い習慣nullです。

代わりに、オブジェクトを変更 (または変更できない場合はファサード)Aして、他のフラグを使用できるようにします。例えばpublic boolean isClosed() ...

于 2013-08-18T00:04:39.527 に答える
2

私は何かが欠けているかもしれませんが、あなたがそれを言及しているので:

オブジェクト自体をクリーンアップする他の方法があるかどうか疑問に思っています。

と:

私は自己完結型のウィジェットを持っています。これは、必要なことを行った後に自分自身を null にすることができれば、大幅に改善されます。したがって、GC にクリーンアップさせ、ウィジェットのユーザーが手動で null に設定する必要がないようにします。

オブジェクトへの参照をまったく保持しないのはどうですか?

new A().doStuffAndDisappear();
// no reference, instance of A is eligible to GC

アップデート

これは OP が探しているものではないため、@Perce ソリューションを展開させてください。

interface AHolder 
{
    void setA(A a);
}

class AParent implements AHolder {

    private A a;

    public AParent() {
        a = new A();
    }

    public void doSomething() {
        a.doStuffAndDisappear(this);
        if(a == null)
        {
            System.out.println("It is true!");
        }
    }

    public void setA(A a) {
        this.a = a;
    }
}

class A 
{
    void doStuffAndDisappear(AHolder parent) {
        parent.setA(null);
    }
}

親の型や を保持するフィールドを知る必要はありませんA

実施例


Aすべての親で null を参照したい場合はA、親のリスト ( List<AParent> parents) を保持するように変更し、親を追跡するメソッドを実装します。

void addParent(AParent parent)
{
    parents.add(parent);       
}

さらに、void cleanUp()null を設定する親を反復処理するもの:

void cleanUp()
{
    for (AParent parent : parents)
    {
        parent.setA(null);         
    }   
    parents.clear();  
} 

このソリューションが JavaBeans Bound Propertiesによく似ていることに注目してください。これは偶然ではありません。ある意味では、単純なイベント/リスナー アーキテクチャを作成してA、親に参照を取得するように通知することができます。

于 2013-08-17T23:16:00.267 に答える
2

はい、アプリケーションで GC を再実装すれば可能です。私の答えは、そのオブジェクトへのすべての参照をnullに設定したいと言ったパトリシアとの議論に触発されました。GC の例:

class MyGC {
   byte[100000] myMemory;
   int nextFreeCell;
   myNew (int value) { }
   get (int myCell) { }
}

このようにして、クラスへの他の参照がないことを制御できます。クラスには、GC メモリのみへの参照も含める必要があります。あなたの例:

int cell = MyGC.new(A.class)

MyGC.get(cell).doSomething();

if (MyGC.get(cell) == null)
   --- true -----
于 2013-08-17T23:45:28.380 に答える
1

それは不可能だと思います。が何らかのaobject のインスタンス変数である場合xdoStuffAndDisappearどうにかしてへの参照を取得しx、セッターを呼び出しaて null に設定することができます。完全に直感に反するので、そのルートには行かないほうがよいでしょう。

でクリーンアップするのが最善ですdoStuffAndDisappear(まあ、make が消えるわけではありません) a。残りは GC が処理する必要があります。

于 2013-08-17T21:58:49.737 に答える
0

オブジェクトに別のオブジェクトの参照をこのように null に設定させることはできません。あなたが望むことをすることは、いくつかの足取りなしでは不可能です. 次の例に反対することをお勧めします。

public class A{
    A other;
    public A(A a){
        this.other = a;
        if(a!=null)
            a.other = this;
    }
    public void doSomethingAndDisappear(){
        a.other = null;
    }
}

これにより、2 番目の参照が最初の参照の参照を null に設定するため、1 つの値の 2 番目の参照への参照が消失します。

于 2013-08-17T21:54:44.233 に答える