只需对接口进行微小的更改,您就可以使方法序列成为唯一可以调用的方法序列 - 即使在编译时也是如此!
public class Stopwatch {
public static RunningStopwatch createRunning() {
return new RunningStopwatch();
}
}
public class RunningStopwatch {
private final long startTime;
RunningStopwatch() {
startTime = System.nanoTime();
}
public FinishedStopwatch stop() {
return new FinishedStopwatch(startTime);
}
}
public class FinishedStopwatch {
private final long elapsedTime;
FinishedStopwatch(long startTime) {
elapsedTime = System.nanoTime() - startTime;
}
public long getElapsedNanos() {
return elapsedTime;
}
}
用法很简单 - 每个方法都返回一个不同的类,该类仅具有当前适用的方法。基本上,秒表的状态被封装在类型系统中。
在评论中,有人指出,即使采用上述设计,您也可以呼叫两次。虽然我认为这是附加值,但从理论上讲,有可能把自己搞砸。然后,我能想到的唯一方法是这样的:stop()
class Stopwatch {
public static Stopwatch createRunning() {
return new Stopwatch();
}
private final long startTime;
private Stopwatch() {
startTime = System.nanoTime();
}
public long getElapsedNanos() {
return System.nanoTime() - startTime;
}
}
这与省略方法的分配不同,但这也是潜在的好设计。然后,一切都将取决于确切的要求...stop()