如何只使用一次方法调用重置所有对象值?

时间:2012-07-09 18:48:27

标签: java

基本上,我想创建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()
    {

    }
    }

5 个答案:

答案 0 :(得分:5)

第一个选项:记住Counter的每个实例。

在某些静态集合中收集Counter的每个实例。 要重置所有内容,只需遍历集合中的所有项目即可。 但是strong references are too strong for this - 确保它是weak references的集合。

说明:

  1. 使用弱引用将避免Counter对象无限期存在的问题,因为它们是在静态集合中引用的。仅由弱引用引用的对象最终由垃圾收集器收集。
  2. 每个实例的集合都可以通过声明Counter构造函数private并仅允许通过static成员函数构建来实现,该函数也将进行注册。 (或使用Factory模式的其他一些化身。)我相信工厂是这里的方式,因为物体的每个构造都必须执行副作用。但也许它会使Counter构造函数注册this与静态集合。
  3. 第二个选项:生成计数器

    保留staticlong生成计数器,并在每个实例中保留此计数器的副本。重置所有计数器时,只需增加static生成计数器。然后,getNumber()方法会根据自己的副本检查static生成计数器,并在static生成计数器发生更改时重置计数器。

    (我真的不知道这个技巧的“官方”名称。How to zero out array in O(1)?

答案 1 :(得分:4)

由于我们不知道上下文是什么,我们无法缩小您应该做的具体事情,但我立即想到的选项是......

1:如果计数器具有超出“counter1,counter2,counter3”的不同含义,那么它们可以是静态类变量(more useful names)。

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

2:如果你只是想要几个不同的计数器,而且它们本身没有特别的意义,你知道它们只有五个,那么你应该使用一个数组:< / p>

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

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

答案 2 :(得分: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
    }
}

答案 3 :(得分: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();
}

答案 4 :(得分:1)

1。首先,不需要将Random nos初始化为实例变量,只需要一个Object Reference Varaible,因为您已在构造函数中初始化它。

例如:

Random number;

2. :创建一个ArrayList并存储所有Counter对象。

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

3. 将每个计数器对象添加到ArrayList。

4。制作重置功能非静态..不需要它是静态的。

5. :迭代并重置......

for (Counter c : arr){

      c.reset();
    }

6. 在重置()中,请执行以下操作..

public void reset(){

         this.number = 0;

     }