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型の定数に整数値を属性として付ける
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();