torutkのブログ

ソフトウェア・エンジニアのブログ

Enum型と整数型との相互変換

Javaで従来定数はstatic final intで定義されていました。例えばJava Communications APIでシリアルポートのデータビット数は、SerialPortクラスにおいて

    public static final int 	DATABITS_5 	5
    public static final int 	DATABITS_6 	6
    public static final int 	DATABITS_7 	7
    public static final int 	DATABITS_8 	8

と定義されています。

今後アプリケーションを書くときにこのような定数はenum型を積極的に使用したいところなので、上記をラッピングして

public enum DataBits {
    BITS_5, BITS_6, BITS_7, BITS_8
}

と定義しました。

一方、Java Communications APIを使うにはSerialPort定数(int型)を使う必要があるので、アプリケーション側で定義したenum型をSerialPort定数(int型)へ変換したり、SerialPort定数(int型)をenum型へ変換する必要があります。

switch文で変換する

順当に思いつく1番目の方法がこれです。

  • int型からenum型への変換
    int portDataBits = port.getDataBits();
    DataBits dataBits;
    switch (portDataBits) {
    case SerialPort.DATABITS_5:
        dataBits = DataBits.BITS_5;
        break;
    case SerialPort.DATABITS_6:
        dataBits = DataBits.BITS_6;
        break;
    case SerialPort.DATABITS_7:
        dataBits = DataBits.BITS_7;
        break;
    case SerialPort.DATABITS_8:
        dataBits = DataBits.BITS_8;
        break;
    default:
        logger.warning("SerialPort#getDataBits returned unknown value : " +
                       portDataBits);
    }
  • enum型からint型への変換
    int portDataBits;
    switch (dataBits) {
    case BITS_5:
        portDataBits = SerialPort.DATABITS_5;
        break;
    case BITS_6:
        portDataBits = SerialPort.DATABITS_6;
        break;
    case BITS_7:
        portDataBits = SerialPort.DATABITS_7;
        break;
    case BITS_8:
        portDataBits = SerialPort.DATABITS_8;
        break;
    default:
        logger.warning("Unknown DataBits value : " + dataBits);
    }

これをenum型DataBitsのメソッドとして追加すれば定義は1回なので、まあ許容範囲かとは思います。

enum型の定数に整数値を属性として付ける

Javaenum型は定数に属性やメソッドをつけられるので

public enum DataBits {
    BITS_5(SerialPort.DATABITS_5),
    BITS_6(SerialPort.DATABITS_5),
    BITS_7(SerialPort.DATABITS_5),
    BITS_8(SerialPort.DATABITS_5);

    DataBits(final int anIntValue) {
        intValue = anIntValue;
    }
    // enum定数から整数へ変換
    public int getIntValue() {
        return intValue;
    }
    // 整数からenum定数へ変換
    public static DataBits valueOf(final int anIntValue) {
        for (DataBits d : values()) {
            if (d.getIntValue() == anIntValue) {
                return d;
            }
        }
        logger.warning("unknown intValue : " + anIntValue);
        return null;
    }

    private int intValue;
}

使用例は次のとおりです。

    DataBits dataBits = DataBits.valueOf(port.getDataBits());
    
    int portDataBits = dataBits.getIntValue();