【Java 8以上】interfaceのdefaultメソッドで共通処理を書く

こんにちは、エキサイト株式会社の蝦名です。

複数のmodelクラスなどで共通の処理を一箇所に書きたいとき、どうしますか?
今回はJava 8から使用できるdefaultメソッドを、モデルなどの共通処理として使用する方法をご紹介します。

interfaceのdefaultメソッドで共通処理を書く

モデルの例

  • コメント
  • コメント番号 を持ったモデルを作成
package com.example.demo.model;

import lombok.Data;

@Data
public class HogeModel implements CommentUtil {
    private String comment; // コメント

    private Integer number; // コメント番号

}

interfaceとdefaultメソッドの例

コメント番号をプレフィックスにしたコメントを取得したい場合

package com.example.demo.model;

import java.util.Objects;

public interface CommentUtil {
    default String getCommnetWithNumber () {
        if (Objects.isNull(getNumber())) {
            return getComment();
        }
        return String.format("%d: %s",getNumber(), getComment());

    }

    String getComment();

    Integer getNumber();

}

使用の例

package com.example.demo.controller;

import com.example.demo.service.HogeService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class DemoController {
    private final HogeService hogeService;

    @GetMapping("/")
    public String index() {
        return hogeService.getHoge().getCommnetWithNumber();
    }

}
package com.example.demo.service;

import com.example.demo.model.HogeModel;
import org.springframework.stereotype.Service;

@Service
public class HogeServiceImpl implements HogeService {

    public HogeModel getHoge() {
        HogeModel hoge = new HogeModel();
        hoge.setComment("1get");
        hoge.setNumber(1);

        return hoge;
    }
}

表示の例

1: 1get

使用できない、したくないパターン

  • defaultメソッドで使用したい情報がモデルのフィールドにない場合
  • 現段階で共通処理を使用したい箇所が一箇所しかない場合(今後増えそうな場合でも)

最後に

使い所が多いテクニックなので重宝しますね!
Javaで共通処理を書くときは選択肢に入れてみてください!

また、より良い方法がありましたらコメントなどで教えていただけると嬉しいです!
見て頂きありがとうございました。