java の enum の ビックリ仰天度は異常

SJC-P でもそのうち取得しようと、トイレの中で足がしびれるぐらい長時間書籍を読んでいた時に発見した(個人的に)ビックリしたjavaの文法。それは!

enum Rozen
{
    GIN, KANA, MIDO, AO;

    public static int  ichigo = 6;
    public static int  getIchigo(){ return ichigo; }
    public static void setIchigo(int n){ ichigo = n; }

    public int aka = 5;
    public int getAka() { return aka; }
    public void setAka(int n){ aka = n; }

    interface BARA{};
    class KIRA implements BARA{};
}

class a
{
  public static void main(String[] args)
  {
    Rozen r = Rozen.KANA;
    System.out.println(r);
    System.out.println(r.getAka());
    System.out.println(Rozen.getIchigo());
  }
}



/* -- 出力結果 -- *

KANA
5
6

*/


 こ れ は 無 ぇ !


なんで enum の中にメンバがもてるんじゃああああ!!

…とか思ってみましたが、javaenum は「単なるクラスの自動生成でしかない」ので、まぁアリといえばアリ…?


いや、無ぇな。うん。(ぉ




ところで、上のリンク先を見て気づいてみたんですけど、列挙子は内部で1回しか new されていないではありませんか。 …となるとですよ…?

class a
{
  public static void main(String[] args)
  {
    Rozen r;

    // r を KANA にする。
    r = Rozen.KANA;
    r.setAka(2);
    System.out.println(r.getAka());
    
    // r を再度 KANA として値を設定しなおす
    r = Rozen.KANA;
    System.out.println(r.getAka()); // 5 が出てくる…?
  }
}

/* -- 実行結果 -- *

2
2

*/

やっぱり…

私としては、C++をずっとやってきた関係で、新しいインスタンスが生成されているという解釈をしてしまいますが…列挙子ごとにしか値が管理できないんですねぇ。こりゃ、知らないとバグの元やねぇー。 今回知ってよかった。うむ。





でも、こんな文法使わないよね。

うん。