• ベストアンサー

Enum 列挙型でお聞きします。

Enum 列挙型でお聞きします。 一般的に、列挙型の使用度はどのくらいがベストなのでしょうか? あまり使用しない方がいいものなのでしょうか? たとえば、データベースにかきこまれているカラム名をEnumの列挙型で指定しようとした場合、 これはやるべきではないのでしょうか? やはり、最初から、確実に決められていないとだめなのでしょうか? どうもいまいち、よくわかりません。 参考URLは、 http://www.stackasterisk.jp/tech/java/jdk506_01.jsp#2_1を参考にしています。 よろしくおねがいします。

  • Java
  • 回答数3
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • hoge_piyo
  • ベストアンサー率57% (15/26)
回答No.3

fswmiyajimさんのサンプルコードをコンパイルしそれを逆コンパイル(jadという野を使えばできます)したソースです↓ final class Columns extends Enum { private Columns(String s, int i, String columnName) { super(s, i); this.columnName = columnName; } public String getColumnName() { return columnName; } public static Columns[] values() { Columns acolumns[]; int i; Columns acolumns1[]; System.arraycopy(acolumns = ENUM$VALUES, 0, acolumns1 = new Columns[i = acolumns.length], 0, i); return acolumns1; } public static Columns valueOf(String s) { return (Columns)Enum.valueOf(Columns, s); } public static final Columns KEY; public static final Columns VALUE; private String columnName; private static final Columns ENUM$VALUES[]; static { KEY = new Columns("KEY", 0, "KEY"); VALUE = new Columns("VALUE", 1, "VALUE"); ENUM$VALUES = (new Columns[] { KEY, VALUE }); } } 1.privateのコンストラクタが自動で追加 2.KEYとVALUEはpublic static finalでクラス変数としてある 3.staticイニシャライザの中でKEYとVALUEのインスタンスを生成している 4.インスタンスの配列を作成し、staticイニシャライザ内でインスタンスを格納 などをしていることがわかると思います。 ちなみにstaticイニシャライザというのがクラスの初期化時に1度だけよばれるものです。 javaのenumの場合コンストラクタは必ず自動的にprivateになるので、クラス外からはインスタンスを生成できません。同じ名前のインスタンスがいくつもあってもenumとして意味がなく、メモリの無駄だからです。

その他の回答 (2)

  • hoge_piyo
  • ベストアンサー率57% (15/26)
回答No.2

Enumとほぼ同じ用なクラスは作成しようと思えばできます。以下のURLのJava魂という本の7章に詳しく書かれています。 http://www.amazon.co.jp/Java%E9%AD%82%E2%80%95%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E6%A5%B5%E3%82%81%E3%82%8B%E5%8C%A0%E3%81%AE%E6%8A%80-Robert-Simmons-Jr/dp/4873112079 簡単にいうとコンストラクタはすべてprivateにしておいて、インスタンスはstatic finalでクラスの初期化時に作成してしまうという方法です。(なおかつそのためのユーティリティクラスを作っておいて、それを継承して作成するようにする) 上記のやり方と、enumを使用した場合の違いとしては、 まず利点としては、switch文で使えるということや、EnumMapで使用できるなどです。switchはif elseの繰り返しよりもパフォーマンス的に有利ですし、同じくEnumMapもHashMapよりはやくなります。 一方欠点としては、継承ができないと言う点、また記述が若干冗長になる点でしょうか。 ただenumも自由にメソッドは追加できたり、インターフェイスは実装できるので、継承ができなくてもそんなに困ることはありません。 質問にある、データベースにかきこまれているカラム名に関してですが、Enumにしてもしなくてもどちらでもいいと思います。ただ、多くの箇所にでてくるのなら、Stringをリテラルで書くのではコンパイル時にミスがチェックできないので、何らかの形で参照するようにしたほうがよいとは思いますが。

回答No.1

回答になるか不安ですが・・・ enumは要素毎に任意の値で初期化された属性を持つ事ができます。 ご参考にされたページでは存在に触れる程度で端折られていますが、 enumには引数付きコンストラクタを定義できます。 それを使う事で、定義内に初期値を記述してやる事が可能です。 例えば、以下の例では文字列型の属性を定義し、初期値を設定しています。 enum Columns { KEY("KEY"), VALUE("VALUE"); private String columnName; private Columns(String columnName) { this.columnName = columnName; } public String getColumnName() { return this.columnName; } } 尚、初期化されるタイミングについてですが、 enumのコンストラクタは当該enumが最初にアクセスされた時に、全ての要素から一斉に呼ばれます。 javaのenumの要素は静的な不変オブジェクトだからです。

kannitiha
質問者

補足

解答ありがとうございます。 このとき、コンストラクタは、 どうよびだすものなのでしょうか? Columns com = new Columns("teest"); と設定するわけではないのでしょうか? 試したところ、errorがでました。 > 尚、初期化されるタイミングについてですが、 enumのコンストラクタは当該enumが最初にアクセスされた時に、全ての要素から一斉に呼ばれます。 javaのenumの要素は静的な不変オブジェクトだからです つまり、たとえばColumns.Keyにアクセスしたとき、コンストラクタが実行される、という事でしょうか? よろしくおねがいします。

関連するQ&A

  • Eclipseによる列挙型の使用

    大学のJava課題を自宅のPCでEclipseを使用してやっているのですが、新たな列挙型を作ろうと新規作成からやろうとしたところ、「このプロジェクトはJDK5.0 準拠ではありません」とでて、作成できませんでした。 どうすればよいでしょうか・・・?

    • ベストアンサー
    • Java
  • VB6 ClassにてEnum(列挙型)のうまい使い方

    へっぽこPGです。 今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。 最近VB6でActiveXDLLにて、DLLを作り始めました。 Classについて勉強を始めたばかりで、 実現できそうな機能と実現できない力量のギャップに苦労しています。 さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、 ExeからDLLを参照してプロパティに値を設定する時に、 インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。 その先困ってます。 VB6でデバッグをしているわけですが、 Class(Dll)とExeは別プロジェクトで生成しており、 Dllはバイナリ変換、デバッグはExeを実行するように設定済です。 これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。 Exeのプロジェクトから、 「開始」・ステップ実行して確認しましたが、 正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で) ActiveXDLLプロジェクトから、 「開始」後、「停止」をして、Dllを上書きしようとすると、 「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、 Msgboxが表示されてしまいます。 どうやらExeがDLLを離していないのでしょうか? もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。 (他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。) 困っている点としては、 1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。 (DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも) 2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。 3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト です。 いろいろとツッコミどころがあるかもしれませんが、 忌憚なくご意見下さい。 ---Class-(test_Class)---- '列挙宣言 Public Enum Chiiki Hokkaidou = 0 Aomori = 1 Akita = 2 End Enum 'プロパティ値を格納しておく変数 dim aaa as integer 'プロパティでEnum宣言した型を引数に指定します、 Public Property Get Shusshin() As Chiiki Shusshin = aaa End Property Public Property Let WindowState(ByVal NewValue As Chiki) aaa = NewValue End Property ---Class-End-------------------- ---Exe----------------- 'Classは参照設定にて '参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢? Sub a 'Class宣言 Dim a_class as test_Class Set a_class = New test_Class 'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン a_class.WindowState = Aomori 'プロパティ値表示(処理自体に意味無し) '「1」 と表示される Msgbox a_class.WindowState 'Class開放 Set a_class = nothing End sub ---Exe-End----

  • ◆Struts サンプルプログラムのURLがわかりません。◆

    Struts初心者です。教えて下さい。 http://www.stackasterisk.jp/tech/java/strutsSec01_03.jsp#5 上記サイトで勉強中にいきずまってしまいました。初歩的質問で申し訳御座いませんが教えて下さい。 4.Strutsアプリケーションの作成 で記載されている通りに jspファイル、javaファイルを配置し、struts-configファイルも記載されているようにしました。 画面を表示させたいのですが、どのような URLにアクセスすれば画面が表示されるのでしょうか・・?? web.xmlの中に urlマッピングする情報を追記したり、struts-configに追記したりする必要がありますのでしょうか・・・?? servletだと web.xmlに、<servlet-mapping>要素に<url-pattern>を定義してURLが判断できたのですが・・・・ 以下のようなURLでアクセスしているのですが、TomcatがHTTPステータス 404を表示します。。tomcatの再起動なども行なっております。 http://localhost:8080/struts-blank/jsp/loginForm.jsp 根本的に理解できていないと思うので、参考になるサイト、書籍などもあったら教えて下さい。 環境 WinXP,JDK1.5,Eclipse3.2,Struts1.2,Tomcat5.x 宜しくお願いします。

  • ソースコードの読み方

    ArrayList の size() メソッドの処理の仕方について、 いろいろ調べてるのですが、自分の力不足で理解ができません。 add については、 http://www.stackasterisk.jp/tech/java/collection02_02.jsp を参考にしたのですが・・・。 バイトコードでは、この size() メソッドを使うと、どのように処理してるかも知りたい所なのですが・・・。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 使用すべきOracle8i用JDBCドライバのバージョンについて

    下記の構成でTomcatからデータソースを利用して DBにJDBC接続しようと思っています。 【OS】 WindowsXP 【JDK】 1.4.15 【アプリケーションサーバ】 Tomcat4.1.36 【データベース】 Oracle8.1.5 Oracleインストール後、%ORACLE_HOME%/jdbc\lib/以下のフォルダには 下記のJDBCドライバしかありませんでした。 classes102.zip (JDK 1.0.2 用) classes111.zip (JDK 1.1.x 用) また下記のURLよりOracle JDBC Driver 8.1.5のJDBCドライバをダウンロードしようと試みました。 http://otn.oracle.co.jp/software/tech/java/jdbc/index.html ところが、Oracle8iについては8.1.7のJDBCドライバのみ公開しており、 その内容を見ても下記のJDBCドライバしかありませんでした。 classes111.zip(JDK 1.1.x 用) classes12.zip(JDK 1.2.x 用) 今回の私の環境では、どこからどのバージョンのJDBCドライバを入手して 使用すればいいのでしょうか? ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • 抽出したものの合計を求める

    こんにちは。 よろしくお願いいたします。 http://www.stackasterisk.jp/tech/java/xml03_05.jsp#6_2 のページのように、○○以上のものをXMLデータからとりだす、というものはわかったのですが、取り出したものの合計を求める、というのができないのです。 このページで言えば、 国数:3国 合計:○○万人 のようなものを、出力結果の下に追加で表示させたい場合どうしたらできるのでしょうか、どなたかわかる方教えてください よろしくお願いいたします

    • 締切済み
    • XML
  • CLASSPATHを設定しても、『ClassNotFound~』になってしまう

    はじめまして、質問をさせていただきます。 JDBCを利用して、データベースにアクセスするため、2週間前から javaを勉強している初心者です。 色々なサンプルを参考にして、javaコードを作成しましたが、 java実行時に『ClassNotFoundException』になってしまいます。 過去の質問から、No.952983やNo.957189を参考にさせていただき、JDBCドライバー をダウンロードし、CLASSPATHの設定をしてみましたが変わりませんでした。 その後も色々と調べましたが、なぜCLASSPATH設定が有効にならないのか分かりません。 お手数かとは思いますが、御教授のほどよろしくお願いします。 サーバのOS :LINUX(FedoraCore5) データベース :Postgresql8.1.4(rpmでインストール) JDKのVer   :1.5.0_08 JDBCドライバー:postgresql-8.1-407.jdbc3.jar ↓.bash_profileの設定 export JAVA_HOME=/usr/java/jdk1.5.0_08 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/$JAVA_HOME/lib/postgresql-8.1-407.jdbc3.jar ↓『set』コマンドで確認したCLASSPATH CLASSPATH=.:/usr/java/jdk1.5.0_08/lib/tools.jar://usr/java/jdk1.5.0_08/lib/postgresql-8.1-407.jdbc3.jar 以上

    • ベストアンサー
    • Java
  • 『ClassNotFoundException: org.postgresql.Driver』というエラーが出る。

    CygwinにpostgreSQLをインストールして、JSPでデータベースを操作しようと考えています。 /usr/share/postgresql/java/postgresql.jarをCLASSPATHに追加し、以下に示すJSPを作成して実行したのですが、『java.lang.ClassNotFoundException: org.postgresql.Driver 』というエラーが出てデータベースにアクセスできません。 『$jar -xvf /usr/share/postgresql/java/postgresql.jar』を実行したところ、『org/postgresql/Driver.class』が抽出されましたので、ドライバクラスは間違ってはいないと思います。一体何が悪いのでしょうか。 <%@ page language="java" %> <%@ page contentType="text/html; charset=EUC_JP" %> <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = null; try { Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:(データベース名)"; con = DriverManager.getConnection(url, "(ユーザー名)", "(パスワード)"); stmt = con.createStatement(); (途中の処理) } catch(Exception e) { out.println(e); } finally { (データベースの切断処理) } postgreSQLはまだ始めたばかりですので初心者同然です。なるべく分かりやすく説明してくれると嬉しいです。 OSはWindowsXP, JSPコンテナはTomcat3.3.1を使用しています。どうぞよろしくお願い致します。

    • ベストアンサー
    • Java
  • JDK10インストール

    java初心者です。 JDKをインストールする https://devnote.jp/jdk_windows/index.html を見ながら進めていたのですが 「setx /M JAVA_HOME "C:¥Program Files¥Java¥jdk-10" 成功 指定した値は保存されました setx /M Path "%JAVA_HOME%¥bin;%Path%" 成功 指定した値は保存されました」 までは良いのですが 「java /version」 「javac /version」 を入力するとどちらも 「内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と出ます。 Pathは確認すると ユーザー環境変数とシステム環境変数どちらにも 「C:¥Program Files¥Java¥jdk-10\bin」とあります。 重複しているのが良くないのでしょうか? JAVA_HOMEは「C:¥Program Files¥Java¥jdk-10」となっています。 最初java /versionは問題なく認識されjavac /versionのみ認識せれていませんと出ていたのですが、その際Pathが通っていないのかと色々試行錯誤し、手順を1から何度かやり直したりもしていました。 それがやはり良くなかったのでしょうか。 本当に初歩的なところの質問をすみません。何か助言頂けますと幸いです。

    • ベストアンサー
    • Java
  • 正しいURL指定しているにもかかわらずJSPファイルにアクセスできず「404エラー」が発生

    サーバサイドJavaアプリに取組んでいる者です。 正しいURL指定しているにもかかわらずJSPファイルにアクセスできず 「404エラー」が発生します。 http://localhost:8080 のURL指定でTomcat画面にアクセスできることは確認済みです。 ですが、http://localhost:8080/project_name/login.jsp にアクセスすると上記エラー発生致します。 何が原因なのか検討つかず困っています。 ご回答やアドバイスお願いします。 ※開発環境 JDK1.5 eclipse3.2.1 Tomcat5.5 何卒宜しくお願いいたします。

専門家に質問してみよう