我正在开发一些框架,我得到了一个应该实现的抽象类。
现在我得到了一些用户应该能够配置的其他东西,但它是可选的。
所以代替抽象方法:
public abstract class AbstractModule {
public void doSomething() {
if (logMessage() != null)
System.out.println(logMessage());
doStuff();
}
protected abstract String logMessage(); // I'm optional
protected abstract void doStuff();
}
我想只检查接口(interface)实现:
public interface Log {
String logMessage();
}
public abstract class AbstractModule {
public void doSomething() {
if (this instanceof Log) {
if (((Log) this).logMessage() != null)
System.out.println(((Log) this).logMessage());
}
doStuff();
}
protected abstract void doStuff();
}
因此,如果有人使用接口(interface) Log 实现 AbstractModule,它也会显示消息。我看到的对实现者的好处:她不需要关心实现 logMessage(),就像在第一个示例中那样。这是一种有效的方法还是应该采用不同的方法?
提前致谢!
最好的问候
最佳答案
我会让 Logger 成为您模块的一个组件,并在抽象类中定义一个默认的无操作记录器。这样您就可以摆脱 instanceof
并仍然保持灵 active 。
interface Log {
void logMessage();
}
public abstract class AbstractModule {
protected Log log;
public AbstractModule(){
this.log = () -> {};
}
public AbstractModule(Log log){
this.log = log;
}
public void doSomething() {
log.logMessage();
doStuff();
}
protected abstract void doStuff();
}
这是一个扩展 AbstractModule
的示例类:
public class Module extends AbstractModule{
public Module(){
super(() -> System.out.println("message"));
}
@Override
protected void doStuff() {
// do stuff
}
}
如果你想暴露记录器,你可以在抽象类中为记录器定义一个getter-method:
public Log getLogger(){
return log;
}
关于java - 抽象类中的可选方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883712/