5

基本的に、Counterオブジェクトを作成したいのですが、必要なのは数値を保持することだけです。そして、resetCountersメソッドで、各オブジェクトの値をリセットしたいと思います。これはおそらく非常に簡単ですが、私は初心者です。

public class Counter
{
    Random number = new Random();

    Counter()
    {
        Random number = new Random();
    }

    public Random getNumber()
    {
        return number;
    }

    public void setNumber(Random number)
    {
        this.number = number;
    }

    public static void main(String[] args) 
    {
        Counter counter1 = new Counter();
        Counter counter2 = new Counter();
        Counter counter3 = new Counter();
        Counter counter4 = new Counter();
        Counter counter5 = new Counter();

    }

    public static void resetCounters()
    {

    }
    }
4

5 に答える 5

5

最初のオプション:の各インスタンスを記憶しますCounter

の各インスタンスをCounter静的コレクションに収集します。すべてをリセットするには、コレクション内のすべてのアイテムを繰り返し処理するだけです。ただし、強参照はこれには強すぎます。弱参照のコレクションであることを確認してください。

備考:

  1. 弱参照を使用するとCounter、静的コレクション内からの参照のためにのみオブジェクトが無期限に存在するという問題を回避できます。弱参照によってのみ参照されるオブジェクトは、最終的にガベージコレクターによって収集されます。
  2. すべてのインスタンスの収集は、コンストラクターを宣言し、登録も行うメンバー関数を介した構築のみを許可することで実現Counterできますprivate(または、ファクトリstaticパターンの他の化身を使用します。)オブジェクトの各構築には副作用も実行する必要があるため、ファクトリがここに到達する方法であると思います。しかし、おそらくコンストラクターを静的コレクションに登録することでうまくいくでしょう。Counterthis

2番目のオプション:生成カウンター

staticタイプの生成カウンターとlong、各インスタンスでこのカウンターのコピーを保持します。staticすべてのカウンターをリセットするときは、生成カウンターを増やすだけです。次に、getNumber()メソッドはstatic生成カウンターを自身のコピーと照合し、static生成カウンターが変更された場合はカウンターをリセットします。

(このトリックの「正式な」名前はよくわかりません。O (1)で配列をゼロにする方法は?

于 2012-07-09T18:54:57.900 に答える
4

コンテキストが何であるかわからないので、あなたがすべき特定のことを絞り込むことはできませんが、私にすぐに思い浮かぶオプションは...

1:カウンターが「counter1、counter2、counter3」以外の明確な意味を持っている場合、それらは静的クラス変数(より有用な名前を持つ)である可能性があります。

   public class Counter {
       static Counter counter1 = new Counter();
       ...
       public void resetCounters() {
         counter1.clear();
         counter2.clear();
          ...
        }
      }

2:いくつかの別個のカウンターが必要であり、それら自体に特別な意味がなく、それらが5つしかないことがわかっている場合は、配列を使用する必要があります。

public class Counter {
  public static void main(String[] args) {
    Counter[] counters = {new Counter(), new Counter(), new Counter(), new Counter(), new Counter()};
    ...
  }
  static void resetCounters(Counter[] counters) {
    for (Counter c : counters) {
      c.reset();
    }
  }
}

または、任意の数を計画している場合は、より洗練されたファクトリパターンの1つを試してみてください。それは実際には、コンテキストが何であるか、実際に何をしようとしているのか、そして演習のポイントが何であるかに依存します。

于 2012-07-09T19:09:56.947 に答える
2

多数のオブジェクトを操作しているので、それらをArrayListなどのある種のコレクションに配置することをお勧めします。

List<Counter> counters = new ArrayList<Counter>();

.add()メソッドを使用して、そこにすべてのカウンターを挿入します。resetCounters()次に、次の方法でメソッドを作成できます。

public static void resetCounters(List<Counter> counters) {
    for(Counter c: counters) {
        // perform some action to reset the counters, as described by you
    }
}
于 2012-07-09T18:52:29.427 に答える
1

目的を達成するための最も簡単でエレガントな方法は、たとえばファクトリなど、作成されたすべてのオブジェクトへの参照をどこかに保持し、必要に応じてそれらをリセットすることです。

public class CounterFactory{
      private List<Counter> counters = new ArrayList<Counter>();

      public Counter createCounter(){
          Counter c = new Counter();
          counters.add(c);
          return c;
      }
      public void resetCounters(){
          for(Counter c : counters) c.setNumber(new Random());
      }
}

そして、メインの方法では、次のように使用します。

public static void main(String[] args) 
{
    CounterFactory f = new CounterFactory();
    Counter counter1 = f.createCounter();
    Counter counter2 = f.createCounter();
    Counter counter3 = f.createCounter();
    Counter counter4 = f.createCounter();
    Counter counter5 = f.createCounter();

    // Reset all counters
    f.resetCounters();
}
于 2012-07-09T18:52:18.327 に答える
1

1.まず、ランダム番号をインスタンス変数として初期化する必要はありません。コンストラクターで既に初期化されているため、オブジェクト参照変数を用意するだけです。

例えば:

Random number;

2. ArrayListを作成し、すべてのCounterオブジェクトを格納します。

ArrayList<Counter> arr = new ArrayList<Counter>();

3.各カウンターオブジェクトをArrayListに追加します。

4.リセット機能を非静的にします。静的である必要はありません。

5.繰り返してリセットします。

for (Counter c : arr){

      c.reset();
    }

6. reset()で、次の手順を実行します。

public void reset(){

         this.number = 0;

     }
于 2012-07-09T18:57:08.563 に答える