Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

書籍 Effective Java | 拡張可能なenumをインターフェースで模倣する

パンくず

Effective Java
拡張可能なenumをインターフェースで模倣する

概要

拡張可能なenumをインターフェースで模倣する

詳細

Enumは継承できないが、インターフェースによる模倣が可能。
実装が重複する場合はヘルパークラスなど外部化することで重複を解消する。

サンプルコード

package effective.creation.chapter6;

import gr.java_conf.tb.tbpg_util.lang.StringUtil;

import java.util.Arrays;
import java.util.List;

public class SampleNo34 {
  private enum Hoge implements HasName {
    HOGE("hoge"), HIGE("hige"), HAGE("hage");
    private String name;

    Hoge(String name) {
      this.name = name;
    }

    @Override
    public String getCapitalizeName() {
      return StringUtil.getCapitalize(this.name);
    }
  }

  private enum Hoo implements HasName {
    HOO("hoo"), HII("hii"), HAA("haa");
    private String name;

    Hoo(String name) {
      this.name = name;
    }

    @Override
    public String getCapitalizeName() {
      return StringUtil.getCapitalize(this.name);
    }
  }

  private interface HasName {
    String getCapitalizeName();
  }

  public static void main(String[] args) {
    printNames(Arrays.asList(Hoge.values()));
    printNames(Arrays.asList(Hoo.values()));
  }

  private static void printNames(List<? extends HasName> hasNames) {
    for (HasName hasName : hasNames) {
      System.out.println(hasName.getCapitalizeName());
    }
  }
}

出力

Hoge
Hige
Hage
Hoo
Hii
Haa