Java 如何仅使用一个方法调用重置所有对象值?

Java 如何仅使用一个方法调用重置所有对象值?,java,Java,基本上,我想创建计数器对象,它们所要做的就是保持数值。在resetCounters方法中,我想重置每个对象的值。这可能很容易,但我是新手 public class Counter { Random number = new Random(); Counter() { Random number = new Random(); } public Random getNumber() { return number;

基本上,我想创建计数器对象,它们所要做的就是保持数值。在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()
    {

    }
    }

实现所需的最简单和优雅的方法是在某个地方保留对所有已创建对象的引用,例如在工厂中,并在需要时重置它们

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

由于您正在处理大量的对象,因此将它们放入某种集合(如ArrayList)将非常有用

List<Counter> counters = new ArrayList<Counter>();
第一个选项:记忆
计数器的每个实例。
在某个静态集合中收集
计数器的每个实例。
要重置全部,只需迭代集合中的所有项。
但是,确保它是一个集合

备注:

  • 使用弱引用将避免
    计数器
    对象无限期存在的问题,因为它们是从静态集合中引用的。仅由弱引用引用的对象最终由垃圾收集器收集
  • 可以通过声明
    计数器
    构造函数
    私有
    并仅允许通过
    静态
    成员函数进行构造来实现每个实例的收集,该函数也将进行注册。(或者使用该模式的其他化身)我相信工厂是通往这里的道路,因为每一个物体的构造都会产生副作用。但是,也许它可以让
    计数器
    构造函数寄存器
    这个
    与静态集合结合起来
  • 第二种选择:生成计数器 在每个实例中保留一个类型为
    long
    静态
    生成计数器,以及该计数器的副本。重置所有计数器时,只需增加
    静态
    生成计数器。然后,
    getNumber()
    方法将对照自己的副本检查
    静态
    生成计数器,如果
    静态
    生成计数器已更改,则重置计数器


    (我真的不知道这个技巧的“官方”名称。)

    1。首先,不需要将随机nos初始化为实例变量,只要有一个对象引用变量,因为您已经在构造函数中初始化了它

    例如:

    2.创建一个ArrayList并存储所有计数器对象

    ArrayList<Counter> arr = new ArrayList<Counter>();
    
    6.在重置()中执行以下操作

    public void reset(){
    
             this.number = 0;
    
         }
    

    因为我们不知道上下文是什么,我们不能缩小你应该做的具体事情的范围,但是我马上想到的选择是

    1:如果计数器的含义不同于“counter1、counter2、counter3”,那么它们可以是静态类变量(带)

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

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

    程序中有一些不正确的地方。你没有在任何地方调用resetCounters()。我想他是在问在resetCounters()代码中放什么。没错,我还没有在main中调用它,但我不明白我需要在resetCounters方法中放什么代码。好吧,鉴于计数器都是
    main
    中的局部变量,没有可能实现OP想要的。这是家庭作业吗?如果是,请标记@路易斯瓦瑟曼:我觉得至少有两种选择……所有
    计数器
    对象都将永远存在,因为垃圾收集器会认为它们是通过
    计数器
    收集使用的。这取决于你对“重置”的定义。如果要覆盖对象中的内容,这可以正常工作。如果要将所有计数器对象发送到中进行垃圾收集,那么请使用。哦,不。我相信OP的意思是
    reset()
    清除所有现有
    Counter
    实例的值,不管这里的“clear”是什么意思。但是考虑一个计数器,它已经被代码> > Ad()(代码)> ED到<代码>计数器,但是没有其他引用指向它。它基本上是死的,但仍将被重置。这对你有意义吗?它不是100%下沉。OP能够有效维护计数器对象的所有引用的唯一方法是将它们放在某种集合中。是否有其他方法可以跟踪不涉及每个对象的代码的对象实例?请参阅右下方:-)第一个选项。这里同样适用:所有
    计数器
    对象将永远存在,由于垃圾收集器会认为它们是通过
    计数器
    收集使用的。这是您在工厂中的选择,只需添加一个
    清除
    方法,您就可以在其中清理列表并完成操作。这个
    清除
    方法会做什么,什么时候调用它?因此
    清除
    只是清理列表。但是那些挂在周围的计数器呢?当调用
    resetCounters
    时,它们将不再被重置。或者,
    clear
    是否区分仍在使用的计数器和已过时且可以删除的计数器?如果是,如何区分?您可能希望在检查的同时检查。(实际上,我在中提供了这两个链接。)请这样做,如果您还有其他问题,请与我联系。这里的问题相同:所有
    计数器
    对象都将永远存在,因为垃圾收集器会认为它们是通过
    计数器
    收集使用的。use正在重置对象,没有让他们为垃圾收集做好准备..对。。。!!正确的。但与上面一样:考虑一个已经被COD的计数器。
    
    ArrayList<Counter> arr = new ArrayList<Counter>();
    
    for (Counter c : arr){
    
          c.reset();
        }
    
    public void reset(){
    
             this.number = 0;
    
         }
    
       public class Counter {
           static Counter counter1 = new Counter();
           ...
           public void resetCounters() {
             counter1.clear();
             counter2.clear();
              ...
            }
          }
    
    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();
        }
      }
    }