在CodeReview提出了一些建议之后,我一直在从C#切换到Java。因此,当我查看LWJGL时,我想起的一件事是,每次调用都Display必须在Display.create()调用该方法的同一线程上执行。记住这一点,我整理了一个看起来像这样的课程。
public class LwjglDisplayWindow implements DisplayWindow {
private final static int TargetFramesPerSecond = 60;
private final Scheduler _scheduler;
public LwjglDisplayWindow(Scheduler displayScheduler, DisplayMode displayMode) throws LWJGLException {
_scheduler = displayScheduler;
Display.setDisplayMode(displayMode);
Display.create();
}
public void dispose() {
Display.destroy();
}
@Override
public int getTargetFramesPerSecond() { return TargetFramesPerSecond; }
@Override
public Future<Boolean> isClosed() {
return _scheduler.schedule(() -> Display.isCloseRequested());
}
}
在编写此类时,您会注意到我创建了一个方法isClosed(),该方法返回Future<Boolean>。这分派给我的一个函数Scheduler接口(这无非是围绕一个包装ScheduledExecutorService。在写schedule的方法Scheduler发现我既可以用我Supplier<T>的说法还是一个Callable<T>参数表示传入的功能。ScheduledExecutorService不包含覆盖了Supplier<T>,但我注意到,lambda表达式() -> Display.isCloseRequested()实际上是与输入同时兼容Callable<bool> 和 Supplier<bool>。
我的问题是,两者在语义上或其他方面是否有区别-如果是,那是什么,所以我可以坚持下去?