連載
» 2007年12月26日 00時00分 公開

Java SE 5.0の新機能、列挙型を習得するソースコードで学ぶ SJC-P 5.0 ドリル(1)(2/2 ページ)

[山本道子,有限会社 Ray]
前のページへ 1|2       

正解

 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 にゃん
実行結果

筆者紹介

山本道子

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



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。