两种默认方法互相调用

时间:2016-08-07 12:14:00

标签: oop design-patterns java-8 default-method

我有这样的界面:

    public interface Foobar
    {
        default void foo( Bar bar )
        {
            foo( bar, 1 );
        }

        default void foo( Bar bar, int n )
        {
            for ( int i = 0; i < n; i++ )
            {
                foo( bar );
            }
        }
    }

一开始我认为它就好了:

    default void foo( byte[] b )
    {
        foo( b, 0, b.length );
    }

    void foo( byte[] b, int off, int len );

我的问题是我要执行foo一次或n次。 任何实现类都可以覆盖其中一个或两个。 (第二种方法用于在性能关键系统中进行批处理)

但似乎我使用default的解决方案并不是好的样式,因为它可以不覆盖它们,并且调用会导致无限循环(最终导致StackOverflow)。

所以,我的问题是:什么是好的OOP风格妥协?

1 个答案:

答案 0 :(得分:2)

您的IFoo界面可能如下所示 -

public interface IFoo {

    default void foo(Bar bar, int n) {
        for (int i = 0; i < n; i++) {
            foo(bar);
        }
    }

    void foo(Bar bar);

}

并且实现IFoo接口的Foo类可以是这样的 -

public class Foo implements IFoo{

    @Override
    public void foo(Bar bar) {
        // process foo logic

    }

}

您不需要在界面内强制执行单循环逻辑,而是立即调用foo。