任意の条件式

switch 文は、ハードコーディングの典型のひとつ *1 ですが、今でも old-timer には根強い人気があるのも事実です。任意のオフジェクに対して、異なる処理を施す必要があるときには、

for e in Object(3), Object("ABC"), Object(good), Object(3.14), Object(Foo()):
    value = e.switch({
        3    : lambda e: e+4,          # integer
        "ABC": lambda e: len(e),       # string
        float: lambda e: e*2,          # user-defined function
        Foo  : lambda e: e.hello(),    # built-in type
        good : lambda e: e(),          # user-defined class
        })
    print value

このコードの断片を実行すると、次のような出力が得られます。

7
3
happy
6.28
hello, world

これを Java 擬で表現すると、次のような感じなります。

switch (e) {
    case 3:                // integer
        value = e+4;
        break;
    case "ABC":            // string
        value = len(e);
        break;
    case good:             // user-defined function
        value = good();
        break;
    case fllat:            // built-in type
        value = e*2;
        break;
    case Foo:              // user-defined class
        value = e.hello();
        break;
}
System.out.println(value);

switch 文の条件式には、任意の数だけでなく、文字列や関数に加えて、任意の型、クラスなどを指定(混在)できるようになってこそ、本格的な OOP の醍醐味を堪能できるようになるのですが、Java/C# の世界では遠い未来の夢物語になってしまいます。(x_x)ξ

《補足》Eiffel の switch に対する戦略も参考にしてください。

*1:Smalltalk: a la carte(23)ifと別れる50の方法《7》switchは百害あって一理なし, 1988.