Ho passato a Java da C # dopo aver ricevuto alcuni suggerimenti da CodeReview. Quindi, quando stavo esaminando LWJGL, una cosa che ho ricordato è che ogni chiamata a Display
deve essere eseguita sullo stesso thread su cui è stato richiamato il metodo Display.create()
. Ricordando questo, ho montato una classe che assomiglia un po 'a questo.
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());
}
}
Durante la scrittura di questo corso noterai che ho creato un metodo chiamato isClosed()
che restituisce un Future<Boolean>
. Questo invia una funzione alla mia interfaccia Scheduler
(che non è altro che un wrapper attorno a ScheduledExecutorService
. Mentre scrivevo il metodo schedule
su Scheduler
ho notato che potevo usare un argomento Supplier<T>
o un argomento Callable<T>
per rappresentare la funzione che è stata passata. ScheduledExecutorService
non conteneva un override per Supplier<T>
ma ho notato che l'espressione lambda () -> Display.isCloseRequested()
è in realtà di tipo compatibile con entrambi Callable<bool>
e Supplier<bool>
.
La mia domanda è, c'è una differenza tra questi due, semanticamente o in altro modo - e se sì, che cos'è, quindi posso aderirvi?