Enum ではなく Class を使う

Enum を使うと switch ... case ... することになる。

たとえば、プログラム言語を Enum で定義して、その名前を表示する例。

using System;

namespace UseClassInsteadOfEnum
{
    public enum ProgrammingLanguageEnum
    {
        CSharp,
        Java,
    }
    
    public class ByEnum
    {
        public static void PrintName(ProgrammingLanguageEnum progLang)
        {
            switch (progLang)
            {
                case ProgrammingLanguageEnum.CSharp:
                    Console.WriteLine("C#");
                    break;
                case ProgrammingLanguageEnum.Java:
                    Console.WriteLine("Java");
                    break;
                default:
                    throw new ArgumentException("progLang");
            }
        }
    }
}

Enum だと、

  • なにかするには switch ... case ... を書かないと、、、
  • 一応 default も書いておかないと心配だし、、、
  • 将来 Enum のメンバを変更したら、全部調べて修正しないと、、、

と、悩むことになる。

クラスにすると、スッキリする。

using System;

namespace UseClassInsteadOfEnum
{
    public class ProgrammingLanguageClass
    {
        // 各項目を表わすインスタンスは static にする。
        private static ProgrammingLanguageClass _cSharp = new ProgrammingLanguageClass("C#");

        public static ProgrammingLanguageClass CSharp
        {
            get { return _cSharp; }
        }

        private static ProgrammingLanguageClass _java = new ProgrammingLanguageClass("Java");

        public static ProgrammingLanguageClass Java
        {
            get { return _java; }
        }

        private String _name;

        // コンストラクタは private にして、クラス外からインスタンスが作れないようにする。
        private ProgrammingLanguageClass(String name)
        {
            _name = name;
        }

        public String Name
        {
            get { return _name; }
        }
    }

    public class ByClass
    {
        public static void PrintName(ProgrammingLanguageClass progLang)
        {
            Console.WriteLine(progLang.Name);
        }
    }
}

使う側からは、同じように見える。

namespace UseClassInsteadOfEnum
{
    class Program
    {
        static void Main(string[] args)
        {
            ByEnum.PrintName(ProgrammingLanguageEnum.CSharp);
            ByClass.PrintName(ProgrammingLanguageClass.CSharp);
        }
    }
}