基本上,我想创建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()
{
}
}
答案 0 :(得分:5)
Counter
的每个实例。在某些静态集合中收集Counter
的每个实例。
要重置所有内容,只需遍历集合中的所有项目即可。
但是strong references are too strong for this - 确保它是weak references的集合。
说明:
Counter
对象无限期存在的问题,因为它们是在静态集合中引用的。仅由弱引用引用的对象最终由垃圾收集器收集。Counter
构造函数private
并仅允许通过static
成员函数构建来实现,该函数也将进行注册。 (或使用Factory模式的其他一些化身。)我相信工厂是这里的方式,因为物体的每个构造都必须执行副作用。但也许它会使Counter
构造函数注册this
与静态集合。保留static
类long
生成计数器,并在每个实例中保留此计数器的副本。重置所有计数器时,只需增加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;
}