Provides a do-nothing object as a default, eliminating null checks.
A “safe” stand-in that does nothing instead of blowing up.
abstract class Logger {
void log(String message);
}
class ConsoleLogger implements Logger {
@override
void log(String message) => print('LOG: $message');
}
class NullLogger implements Logger {
@override
void log(String message) {} // does nothing
}
class App {
final Logger logger;
App({Logger? logger}) : logger = logger ?? NullLogger();
void run() {
logger.log('App started'); // safe, never null
}
}
// Usage
App().run(); // silent (NullLogger)
App(logger: ConsoleLogger()).run(); // LOG: App started