Effective Java 第2版 (The Java Series) を読み始めたんですが、その中で enum が取り上げられていました。
enum が Java に追加された事は知ってましたが、中身までは調べておらずどうせ他の言語(C とか C#) と同じだと思ってたのでビックリ!
C# の場合、メソッドのパラメータやプロパティに Enum を指定しても不適切な値が渡されるケースがあるので、厳密には型チェックの必要があります。
using System; public enum Style { 太字, 斜体, 下線, 取り消し線, } class Program { static void Main(string[] args) { Write(Style.太字); Write(Style.斜体); Write(Style.下線); Write(Style.取り消し線); Write((Style)16); // コンパイルエラーにならない } static void Write(Style s) { // 厳密な型チェックを行う必要がある! if (!Enum.IsDefined(typeof(Style), s)) { Console.WriteLine("Not Define {0}", s); return; } Console.WriteLine(s); } }public class EnumTest { public static void main(String[] args) { write(Style.太字); write(Style.斜体); write(Style.下線); write(Style.取り消し線); } public static void write(Style s) { System.out.println(s); } } enum Style { 太字, 斜体, 下線, 取り消し線, }
上で提示した Style っていう enum は複数の値を組み合わせて使う想定の場合どうでしょう?C# では、列挙値をビットに見立ててビット演算を使います。enum には、MSDN FlagsAttribute クラス を付与しましょう!
using System;
[Flags()]
public enum Styles
{
太字 = 0x01,
斜体 = 0x02,
下線 = 0x04,
取り消し線 = 0x08,
}
class Program
{
static void Main(string[] args)
{
Write(Styles.太字);
Write(Styles.斜体);
Write(Styles.下線);
Write(Styles.取り消し線);
Write(Styles.太字 | Styles.斜体);
Write(Styles.斜体 | Styles.下線 | Styles.取り消し線);
Write((Styles)16); // コンパイルエラーにならない
}
static void Write(Styles s)
{
/* FlagsAttribute が付与されている場合、Enum.IsDefined では正しく検証出来ない。独自のチェック機構が必要!今回は省いてます。
if (!Enum.IsDefined(typeof(Styles), s))
{
Console.WriteLine("Not Define {0}", s);
return;
}
*/
Console.WriteLine(s);
}
}
Java では、ビット演算は出来ないなぁと思ってたら、Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle を使って似た様な事が出来るみたい。