java - 抽象类中的可选方法实现

标签 java interface java-8 abstract

我正在开发一些框架,我得到了一个应该实现的抽象类。

现在我得到了一些用户应该能够配置的其他东西,但它是可选的。

所以代替抽象方法:

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/

相关文章:

c# - 是否可以对具有显式实现的接口(interface)属性的类进行 json 序列化?

java - flatMap 类型 - 尝试合并 DoubleStreams

java - 如何移植项目?

java - 空 arrayList 和空字符串抛出 StringIndexOutOfBounds 异常

java - 如何动态返回每个节点的一组对象?

java - Java 中的类型 List 与类型 ArrayList

Java - 带接口(interface)的 protected 修饰符

java - 随机生成器 - 继承变量

java-8 - 使用多个条件过滤列表

datetime - Java 8 解析 ISO-8601 日期忽略时区的存在(或不存在)