ゆるふわ技術日誌

エンジニア見習いの悪戦苦闘日記

JavaのEnumすげーじゃんという話 #189

今日やったこと

Java書いてた。Enumすごい。

数日前にも書いた「JavaでBASIC(風な言語の)インタプリタを作る」という謎な課題の提出期限が迫ってきたのでちまちま作業してました。

その中で列挙型に正規表現を突っ込んでマッチするか、みたいなことをやったのですが思った以上にキレイに書けて嬉しくなったので書きます。

Enum で振る舞う - Qiita

なお言いたいことは大体ここに書いている。

要は列挙型にメソッド持たせられるのすごいよねという話です。

こんなコードを書いた。

package newlang3;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public enum LexicalPattern {
    NAME("^[a-zA-Z]"),
    SYMBOL("^[=<>+-/,\\(\\)\\*]"),
    NUMBER("^\\d");

    private final String regexp;

    LexicalPattern(final String regexp) {
        this.regexp = regexp;
    }

    private Pattern toPattern() {
        return Pattern.compile(regexp);
    }

    private boolean isMatch(String str) {
        Matcher matcher = toPattern().matcher(str);
        return matcher.matches();
    }

    public boolean isMatch(char c) {
        return isMatch(String.valueOf(c));
    }

    public static LexicalPattern isMatchAny(char c) {
        for (LexicalPattern pattern : values()) {
            if (pattern.isMatch(c)) {
                return pattern;
            }
        }
        return null;
    }
}

最後のメソッド、isMatchAny()は列挙型にある正規表現のいずれかにマッチすればそのオブジェクトを返すということをしたいのですが、こんなにスッキリ書けるとは。

ポイントはvalues()を使うことで列挙型のすべての要素を取ってくることができる点でしょうか。嬉しみ。

………なんて喜んでますが僕のJava力の低さが露呈しましたね。悲しい。

雑談

JavaはそこそこにJSを書きたい……欲を言えばTSを………