4

我的教授希望我这样做:

使用下面的 Counter 接口编写多个可互换的计数器

public interface Counter {
/** Current value of this counter. */
int value();
/** Increment this counter. */
void up();
/** Decrement this counter. */
void down();
}

开发以下内容:

一个接口 ResetableCounter,除了支持 Counter 的消息外,还支持消息 void reset()。

这是我所做的:

public interface ResetableCounter {
void reset();
int value();
void up();
void down();
}

一个名为 BasicCounter 的 ResetableCounter 实现,它从值 0 开始,分别向上和向下计数 +1 和 -1。

这是我所做的:

public class BasicCounter implements ResetableCounter
    {
      int counterVariable = 0;
    public static void main(String[] args)
    {
        BasicCounter cnt = new BasicCounter();
        cnt.up();
        cnt.down();
        System.out.printf("The value is %d", cnt.counterVariable); 
    }

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

    public int value() {
        return this.counterVariable;
    }

    public void up() {
        ++this.counterVariable;
    }

    public void down() {
        --this.counterVariable;
    }
    }

一个名为 SquareCounter 的 ResetableCounter 实现,它从值 2 开始,通过对其当前值进行平方来计数,并通过对其当前值的平方根进行计数(始终向上舍入,即 1.7 舍入为 2,就像 1.2 被舍入一样到 2)。

这是我所做的:

public class SquareCounter implements ResetableCounter {
int counterVariable = 2;
public static void main(String[] args) {
    SquareCounter cnt = new SquareCounter();
    cnt.up();
    cnt.down();
    double d = Math.ceil(cnt.counterVariable);
    System.out.printf("The value is %f", d); 
}

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

public int value() {
    return this.counterVariable;
}

public void up() {
    Math.pow(this.counterVariable, 2);
}

public void down() {
    Math.sqrt(this.counterVariable);
} 
 }

ResetableCounter 的一个实现称为 FlexibleCounter,它允许客户端在创建计数器时指定起始值以及附加增量(用于向上计数)。例如 new FlexibleCounter(-10, 3) 将产生一个当前值为 -10 的计数器;在调用 up() 之后,它的值将是 -7。

我还没有弄清楚这一点。

您的所有实现都应该是可重置的,并且每个实现都应该包含一个 main 方法,该方法使用 assert 测试实现是否按预期工作,就像我们在讲座中所做的那样(这是一种简单的单元测试方法,我们将在稍后讨论)。

到目前为止,我需要对我的工作发表评论。你觉得够了吗?我如何在可复位计数器上工作?我对 JAVA 很陌生,而且自从我使用 C++ 以来已经很久了。

4

2 回答 2

1
  1. 扩展
    SquareCounter 可以扩展 ResetableCounter,而 ResetableCounter 可以扩展 SimpleCounter。好处是您不需要重新实现类似reset();or的方法value();

  2. 线程安全
    如果您打算让您的类在多个场合使用,您需要同步这些方法,或者在AtomicInteger. 否则,您可能有两个线程同时up()读取您的值,但在一种情况下返回了旧值。

  3. 主班
    不要让你的主班在柜台班。该方法有一个单独的.java 文件。

于 2014-08-15T07:42:15.730 回答
1

Ben 所说的扩展绝对是个好主意,虽然 ResettableCounter 接口实际上也可以扩展 Counter 接口,然后 reset() 将是您需要在 ResettableCounter 接口中声明的唯一新方法。

于 2017-07-31T21:08:29.653 回答