Slide 51
Slide 51 text
Rebinding scoped values (2/2)
class Server {
final static ScopedValue PRINCIPAL =
ScopedValue.newInstance();
void serve(Request request, Response response) {
var level = (request.isAdmin() ? ADMIN : GUEST);
var principal = new Principal(level);
ScopedValue.where(PRINCIPAL, principal)
.run(() -> Application.handle(request, response));
}
}
class Logger {
void log(Supplier formatter) {
if (loggingEnabled) {
var guest = Principal.createGuest();
var message = ScopedValue.where(Server.PRINCIPAL, guest)
.call(() -> formatter.get());
write(logFile, "%s %s".format(timeStamp(), message));
}
}
}
.call(() -> formatter.get())
の範囲でのみ、Server.PRINCIPALとして
guestを使う