ソースコードで学ぶ SJC-P 5.0 ドリル

ソースコードで学ぶ SJC-P 5.0 ドリル

第1回 SJC-P 5.0の新機能、列挙型を習得する

山本道子(有限会社 Ray)
2007/12/26

正解

 D

解説

 問題文のソースコードでは、クラス定義内に列挙型を作成しています。enumキーワードを使用しCatsという列挙型の定義を行っています。そしてHANA、NAMIという値を列挙しています。これによりCatsは、HANA、NAMIという2つの値を持つことになります(ソースコード2行目)。

  2.   public enum Cats {HANA, NAMI};

 列挙した値にアクセスする場合は、「列挙型名.値」とするため、ここでは「Cats.HANA」としています。その結果、HANAという値を持つCats型のオブジェクトを獲得しています(ソースコード4行目)。

  4.     Cats cat = Cats.HANA;

 switch文の式において獲得したcatオブジェクトを使用しています。従来、switch文の式で使用できる型は、byte、char、short、intの4つの型のみでしたが、列挙型も使用可能です(ソースコード5行目)。

 5.     switch(cat) {

 caseにおいて、HANAに合致した場合は7行目が実行されますが、この例ではbreak文の記述がないため、合致した文より下に記述されている9行目の処理も実行されます。従ってHANA、NAMIの両方が出力されます(ソースコード6〜9行目)。

 6.     case HANA:
7. System.out.println("HANA");
8. case NAMI:
9. System.out.println("NAMI");

 もし、7行目を以下のように修正すると、HANAのみが出力されます(ソースコード6〜7行目)。

 6.     case HANA:
7. System.out.println("HANA");break;

【問題】 次のプログラムをコンパイルし、実行するとどうなりますか? 1つ選択してください。 1. class Test { 2. public enum Cats {HANA, NAMI}; 3. public static void main(String[] args) { 4. Cats cat = Cats.HANA; 5. switch(cat) { 6. case HANA: 7. System.out.println("HANA"); 8. case NAMI: 9. System.out.println("NAMI"); 10. } 11. } 12. } A.HANA B.NAMI C.コンパイルエラー D.HANA NAMI   E.実行時エラー

さらにもう一歩

 列挙型はオブジェクトとして扱われるとお話しました。実は、独自に列挙型を宣言すると、コンパイラによって自動的にjava.lang.Enumクラスのサブクラスとして作成されます。

class Test {
    public enum Cats {HANA, NAMI}; // クラス内に列挙型を宣言
    ……
}
                             ↓コンパイルすると?
public static final class Test$Cats extends Enum{ /* Enumクラスをスー
パークラスに持つTestクラスのインナークラスとして作成される(※1)*/
  public static final Test$Cats HANA;
  public static final Test$Cats NAMI;
  public static final Test$Cats[] values() {……}
  public static Test$Cats valueOf(String s) {……} /* values()、 valueOf()といったメソッドが用意される(※2) */
  static{……}
  ……
}

※1 もし列挙型をクラス外に宣言した場合は通常のクラスとして生成されます。
※2 values()、valueOf()の各メソッドはAPIドキュメントで確認してください。

 コンパイラによって作成された列挙型のクラスは、コンストラクタがprivate指定されて用意されるため、私たちが明示的にnewキーワードを使用してインスタンス化することはできません。しかし、以下のようにコンストラクタやメソッドを独自に定義することは可能です。


enum Cats {
  HANA(“みゃぁ”),NAMI(“にゃん”); // コンストラクタに文字列を渡す
  private String val;
  Cats(String val) { this.val = val; } // コンストラクタの定義
  public String getVal() { return val; } // メソッドの定義
}

class Test2 {
  public static void main(String[] args) {
    Cats hana = Cats.HANA; /* これによりHANAオブジェクトが生成され
る際に”みゃぁ”文字列がval変数に格納される */
    System.out.print(hana + " ");
    System.out.println(hana.getVal());
    Cats nami = Cats.NAMI; /* これによりNAMIオブジェクトが生成され
る際に”にゃん”文字列がval変数に格納される */
    System.out.print(nami + " ");
    System.out.println(nami.getVal());
  }
}

HANA みゃぁ
NAMI にゃん

実行結果



今回のインデックス
 列挙型の問題を解いてみよう (1ページ)
 解説と関連知識でさらにもう一歩前進! (2ページ)

筆者プロフィール
山本道子●有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。


@IT Special 注目企業
@IT Special ラーニング
関連キーワード

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード


スキルアップに役立つサービス
ITトレメ スキルアップに役立つ問題を無料で出題
ラーニングカレンダー ITスキル研修4000件、最新情報の検索できます

キャリアアップ

スポンサーからのお知らせ

・ケ・ュ・チマツ、クヲオ貍シ・ケ・ン・・オ。シ

- PR -
@IT Special 注目企業
インデックス

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報


@IT Special ラーニング