Java enumのコンストラクタは変?




みなさんは、enumを使ってますか?
そうですよね。enum使いますよね。

でも、少し変なとこないですか?

とりあえずソースを見てみよう

ソースを書くのが面倒だったんで、昔に書いたソースが良さそうだったんで、このソース(抜粋)でいきます。

Java enum(列挙型)に数値や文字列など色々な値を格納しておく

2023.04.03
よくある、値を持っているふつーのenumです。

何もおかしくないけど?

はい。おかしくないです。ふつーのenumです。
値を持たせようと思ったら、こんな感じに書くと思います。

・・・。

茶番は終わりにして・・・
タイトルに書いてしまいましたが、コンストラクタ。変ですよね?

enumはクラス。列挙子にはそのクラスのインスタンス。

enumはクラスです。
このあたりは、近いうちに?Youtubeでやる?と思うので?、ここでは割愛します。

んで、その作成したenumは、java.lang.Enumクラスを継承したクラスです。
enumの列挙子には、原則、そのクラスのインスタンスが格納されるんですが、このときには何らかの方法でインスタンス化が必要です。

java.lang.Enumのコンストラクタを見てみよう

インスタンス化したいので、親であるjava.lang.Enumのコンストラクタは、superしないといけません。

java.lang.Enumのコンストラクタは、これだけ。漢気にあふれてます。

ちなみに、さっきのコードのコンストラクタは、これでした。。

違和感ないですか?

ん?呼べないじゃん!

はい。このままではsuperできませんね。
enumをこのままクラスに書き直してもコンパイルエラーってことですね。

どゆこと?

これは、javaのコンパイラがいい仕事をすることで、解決します。
つまり、ソースコードを自動的に改変改良したうえで、コンパイルする。ってことです。

さっきのコードでいくと、具体的には、こんな感じになります。

第1引数、第2引数は、java.lang.Enumのコンストラクタの定義。
第3引数以降が、さっきのコードのコンストラクタです。
といった感じで、コンパイラが書換えて、第1引数、第2引数を足してくれます。

また、列挙子はフィールド変数(定数)になるので、そのクラスのインスタンス化、staticメソッドのコードなどを追加してくれます。
これで、無事コンパイルできますね。めでたし。

ということで、今回はenumのコンストラクタで見てきましたが、enumがクラスに変換されることを考えれば、ふだんenumで書いているコードの記述は不完全ってことです。
ふだん書いているenumのコードは、見かけ上、辻褄が合っているように見えるだけで、クラスになると少し中身は変わるっていうお話しでした。

でも、この仕組みのおかげで、簡単に書くことができるんですよね。助かります。


Youtubeの方で、たぶんenumをやるつもり?なんですが、しばらくはここまでやらないかなー。
と思ったんで、とりあえずこっちに書いてみた次第です。