enumは便利ですよね。
でも、一緒に数値とか文字列とか持っておきたいことないですか?
こんなときはこちらw
enumに数値や文字列など色々な値を格納しておくサンプル
enumに音階の周波数をdouble、ふつーのドレミをStringで一緒に格納してみました。
ここから1つ取り出し。追加した情報を取り出してみます。
また、enumに作ったメソッドで1オクターブ高い周波数を計算してもらいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public class EnumTest { public static void main(String[] args) { //enumから各種取り出し String name = Scale.A4.name(); double frequency = Scale.A4.frequency(); String scaleName = Scale.A4.scaleName(); System.out.println(name + " " + frequency + " " + scaleName); System.out.println("1オクターブ上の周波数:" + Scale.A4.octaveFrequency()); } } enum Scale { //括弧内は、音階の周波数、ふつーのドレミ A4(440.0,"ラ4"), B4(493.9,"シ4"), C5(523.3,"ド5"), D5(587.3,"レ5"), E5(659.3,"ミ5"), F5(698.5,"ファ5"), G5(784.0,"ソ5"), A5(880.0,"ラ5"); //括弧内のデータ型を宣言 private final double frequency; private final String scaleName; //コンストラクタ Scale(double frequency, String scaleName) { this.frequency = frequency; this.scaleName = scaleName; } //アクセサ public double frequency() { return frequency; } public String scaleName() { return scaleName; } //おまけのメソッド(1オクターブ上の周波数を返す) public double octaveFrequency() { return this.frequency * 2.0 ; } } |
実行結果
enumに音階の周波数をdouble、ふつーのドレミをStringで一緒に格納してみました。
ここから1つ取り出し。追加した情報を取り出してみます。
また、enumに作ったメソッドで1オクターブ高い周波数を計算してもらいます。
1 2 | A4 440.0 ラ4 1オクターブ上の周波数:880.0 |
サンプルの解説
enumの中にある定数の横に括弧でくくって、追加の情報を書くことができます。
ただ、このままでは使えないので、列挙した定数の下に括弧内のデータ型とコンストラクタを書きます。
ここまではお決まりのパターンですw
ついでに、1つおまけのメソッドを作りました。こんな感じで簡単なことはenumの中でできちゃいますね。
余談ですが、音階の周波数はこんなふうに計算できますw
なので、そもそも持っておく必要はないわけですが。。ねたってことで。
440Hz(基準ラ/A4) * 2^(n/12)
※n=基準ラから半音ずらした数(ピアノの鍵盤でいえば、黒鍵と白鍵含めて右or左にずらす)