【Java8】関数インターフェースでメソッドチェーン


どこにあったかは忘れたけど別言語で関数インターフェースを使ってメソッドチェーンを組む方法が紹介されていたのでそれをJavaに起こしてみた。

import java.util.function.Consumer;

public class Hoge
{
    public void method1() { /* 何らかの処理 */ }
    public void method2( final int value ) { /* 何らかの処理 */ }
    public void method3() { /* 何らかの処理 */ }

    public Hoge chain( final Consumer<Hoge> call )
    {
        call.accept( this );
        return this;
    }
}

呼び出し元

final Hoge hoge = new Hoge();
hoge.chain( o -> o.method1() )
    .chain( o -> o.method2( 5 ) )
    .chain( o -> o.method3() );

メソッドチェーンでHogeクラス内のメソッドを繋げて呼ぶことができる。
けど素直にvoidを自クラスにしてthisで返した方がいいような気もするけどメモとして。

追記

interfaceで実装してみてはどうか、というコメントを頂いたので抜き出してみました。

ChainInterface.java
import java.util.function.Consumer;

public interface ChainInterface
{
    @SuppressWarnings( "unchecked" )
    public default <T extends ChainInterface> T chain( final Consumer<T> call )
    {
        call.accept( (T) this );
        return (T) this;
    }
}

使う時はHogeクラスに「implements ChainInterface」を付ける。

Hoge.java
public class Hoge implements ChainInterface
{
    public void method1() { /* 何らかの処理 */ }
    public void method2( final int value ) { /* 何らかの処理 */ }
    public void method3() { /* 何らかの処理 */ }
}

呼び出し元

final Hoge hoge = new Hoge();
hoge.chain( (Hoge o) -> o.method1() )
    .chain( (Hoge o) -> o.method2( 5 ) )
    .chain( (Hoge o) -> o.method3() );

「(Hoge o)」のようにしないといけないけどこれを省略できる方法があるのかな。