0

いくつかの「カウンター」フィールドを持つカスタム オブジェクトがあります。このオブジェクトは、再帰的に呼び出される関数内でインクリメントされるフィールドを取得します。そのため、関数が呼び出されるたびにオブジェクトを新しく作成して、カウンターフィールドをリセットする必要がありますが、関数が再帰呼び出しにある場合は新しく作成されません。わかる?

現在、メソッドをオーバーロードすることでこれを行っているため、真の再帰ではありませんが、カウントが永続化されるように、カウンターを使用して同じオブジェクトを渡しています。

基本的に、以下のようなものは、私が今やっているものです:

static Counter count(Object parent) 
{
    Counter newCounter = new Counter();
    newCounter = count(parent, newCounter);

    return newCounter;
}

static Counter count(Object parent, Counter currentCounter) 
{
    Object cur = new Object(parent);

    if(cur.isChild())
        Counter.child++;
    else if(cur.isParent())
    {
        Counter.parent++;
        count(cur, currentCounter);
    }

    return currentCounter;
}

これを行うより良い方法はありますか?または、過負荷を必要としない方法はありますか? ああ、システム内の他の場所で簡単に変更できない制約があるため、main メソッドを静的に保つ必要があります。

4

1 に答える 1

0

静的変数の使用:(単一のスレッドのみを想定)

static Counter counter;

public static Counter count(Object parent) 
{
    counter = new Counter();
    count2(parent);
    return counter;
}

private static void count2(Object parent) 
{
    Object cur = new Object(parent);

    if(cur.isChild())
        Counter.child++;
    else if(cur.isParent())
    {
        counter.parent++;
        count2(cur);
    }
}

またはマルチスレッドの場合:

class ThisClass
{
  private Counter counter;

  private ThisClass() { counter = new Counter(); }

  public static Counter count(Object parent) 
  {
    ThisClass thisClass = new ThisClass();
    thisClass.count2(parent);
    return thisClass.counter;
  }

  private void count2(Object parent)
    ...
}
于 2013-02-20T11:49:04.173 に答える