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也将进行注册的成员函数进行构造来实现每个实例的集合。(或者使用工厂模式的其他化身。)我相信工厂是通往这里的路,因为每个对象的构造都必须执行一个副作用。但也许它可以让Counter构造函数注册this到静态集合。

第二种选择:生成计数器

保留一个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:如果你只想要几个不同的计数器,它们本身没有特别的意义,而且你知道它们永远只有五个,那么你应该使用一个数组:

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();
    }
  }
}

或者,如果您打算拥有任意数量的它们,您可以尝试其中一种更高级的工厂模式。这真的取决于上下文是什么,你实际上想要做什么,以及练习的目的是什么。

于 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

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 回答
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());
      }
}

在 main 方法中,这样使用它:

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 回答