• 締切済み

Javaの定数の定義について、教えてください

Android StudioでAndroidアプリを作っています。 使用言語はJavaです。 現在コーディングしている部分では定数を定義しているんですが、 例えば以下の3つの定数があるとして、 final HOGE = 1; final FOO = 2; final BAZ = 3; あとから、2つ目と3つ目の間に filnal BAR = 3; という違う定数を入れたいとします。 そうすると、 filnal BAZ = 4; に手動で数値をずらさないといけません。 定数の定義の数が膨大になっていて、非常に面倒なのです! これを回避するのに、最適な方法を教えてください。 ちなみに、スクリプト言語のHSPでは、 #enam HOGE = 1 #enum HOO #enum BAR #enum BAZ ・・・と、列挙していくだけで、自動的にコンパイラがインクリメントしてくれるので、プログラマが悩まなくても良いようになっているんですが。 同じことって、できますか? 調べた限りでは、C言語でも、似たような事ができるみたいですけど。 Javaでも可能でしょうか?

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • _kappe_
  • ベストアンサー率68% (1523/2217)
回答No.1

Javaにも列挙型 (enum) があるので下記のような書き方ができます。 enum Fruit { APPLE, BANANA, CHERRY } ただし、APPLEの値を101にセットしたら自動的にBANANAが102、CHERRYが103になるような機能はありません。 詳しくは「java enum」でググってください。

pepepe777
質問者

お礼

ご回答ありがとうございます。 列挙型enumについては、一応は知っていましたが、目的に沿わないものだったので、敬遠していました。

pepepe777
質問者

補足

ただ単に自動的にカウントアップする機能が欲しかっただけなんです。 カウントアップできるなら、定数でさえなくても良いと思っています。 そこで、普通の変数とカウントアップするメソッドを組み合わせて、原始的にやっちゃったんですが、今度は、swich文のcaseに指定する値のところで「定数を指定する必要があります」というエラーが出てしまいました。 原始的でも、ブサイクでも、なんでもいいので、解決案をください・・・

関連するQ&A

  • ダブルクォートで囲まれた文字列の取り出し

    Windows環境でRuby 1.8.7を使用しております。 ----sample1.txt----- hoge"foo\"bar\"foo"hage"bar\"baz\"bar"hoge ------------------ ファイルから1行ずつテキストを読み込んで処理を行います。上のsample.txtの様な行を読み込んだ場合にダブルクォートで囲まれた部分 foo\"bar\"foo bar\"baz\"bar を取り出すのにはどの様な正規表現を用いればよろしいでしょうか? エスケープされたダブルクォートを除ける上手い方法がわかりません。 また、ダブルクォートで囲まれた部分が複数行にまたがる場合はどの様に処理をすれば良いでしょうか? -----sample2.txt----- hoge"foo \"bar\" baz" hage ---------------------- -----sample3.txt----- hoge"foo \"ba r\"baz" hage ---------------------- 最初の例のように1行の場合は File.foreach(file) do | line | …… end で良いのですが、複数行の場合には同じように単純には行きません。 ダブルクォートの数を数えて、奇数の場合は偶数になるまで次行をくっつける様な処理を考えているのですが、もっと適切な方法はありますか? 宜しくお願いします。

  • foo bar baz qux・・・・?

    himajin2003の頃 「hogeの意味」について聞いたことがあったが 今回はその第二弾である。 今日、あるサイトのコンテンツを見ていたら 「quxは知る人ぞ知る、foo bar bazの次である」という記述を見つけた。 基本的に僕が見たことがあるのはfoo bar までであり、今日知ってびっくりした。 さて、これって何の順番なのでしょう? 何が根拠なのでしょう?

  • 演算子の結合性

    演算子のリストに結合性という項目があります. 左から右,または右から左と書いてあると思います. 演算子のリストは上にある順から優先的に計算されるので, 例えば, ex) int i = hoge + bar * baz; としたとき,bar * baz が先に計算されることは理解しています. しかし掛ける,または足すオペランドの結合性がよくわかりません. *(掛ける)は「左から右」と一覧があるサイトには書いてあります. この「左から右」は,なにから見て左(右)なのでしょうか? C言語を何年か使っていますが,コンパイラが文をどのように解釈しているのか いまだによくわかっていません. よろしくお願いします.

  • これらの意味は?

    プログラムの本を読んでいると、よく目にする引数や変数があります。 コンピュータ用語辞典などをみても意味がわかりません。なにかの 省略形なのでしょうか? あるいは もともと意味などないのでしょうか? ご存知でしたら教えてください。 1.argc 2.argv 3.args 4.hoge 5.foo 6.bar 7.baz

  • Linux シェルスクリプトでの XML 読み込み

    次のような xml があります。 ------------------------------------------------------------------------------------------------------------------ <?xml version="1.0" ?> <ROOT> <hoge> <fuga> <piyo>/var/log/tokyo</piyo> <hogera>7</hogera> <hogehoge>*.log</hogehoge> </fuga> <fuga> <piyo>/var/log/osaka</piyo> <hogera>3</hogeara> <hogehoge>*.log</hogehoge> </fuga> </hoge> <foo> <bar> <baz>/media/tokyo/tokyo.zip</baz> <qux>/var/log/tokyo</qux> <quux>7</quux> <foobar>*.log</foobar> </bar> <bar> <baz>/media/osaka/osaka.zip</baz> <qux>/var/log/osaka</qux> <quux>3</quux> <foobar>*.log</foobar> </bar> </foo> </ROOT> ------------------------------------------------------------------------------------------------------------------ 1)要素 qux の値を取り出してパスを評価 2)パスが存在すれば要素 foobar の条件に一致したファイルを要素 baz にアーカイブする というシェルスクリプトを作成したいのですが、良い方法が分かりません ご教授いただければ幸いです。

  • NULLポインタが0でない処理系とは?

    http://okwave.jp/qa/q7458540.html にて、 > C言語の規格上、0はNULLポインタとして扱われますが > NULLポインタは0とは限らないので(0でない処理系もあります)。 と他の回答者が答えていたのが妙に引っかかりました。 後学のために知っておきたいのですが、 どの処理系だとNULLポインタが0ではないのかどなたかご存じないですか? 気になって、C99の仕様書らしいものを検索で見つけたのですが、 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf これによると、6.3.2.3 Pointers の 3節 にて、 > An integer constant expression with the value 0, > or such an expression cast to type void *, is called a null pointer constant. とあり、7.17 Common definitions <stddef.h> の 3節 でも、 > The macros are > NULL > which expands to an implementation-defined null pointer constant; (略) とあるので、NULLポインタを表す定数は0か(void*)0だと思っていたのですが。 言い換えると、 struct foo { char* bar; }; と構造体が定義されている時、 struct foo baz; bzero(&baz, sizeof(baz)); すればbaz.barはNULLポインタ定数に初期化されると思っていたのですが、 これだとダメな処理系はどういう処理系で、どんな用途で使うのでしょうか? おそらく、0でない値にした目的や歴史的経緯があるのではないかと推測するのですが。

  • 新規ソース内のマクロ定義が既存ソース内のマクロ定義と衝突しない策について

    C言語です。 Effective C++か何かで読んだ const int hoge = 3; const char *bar = "HOGEHOGE"; などを使用しようと思ったのですが、 C言語ではコンパイルする際に、 「関数の外では定数は宣言できません」?? のようなエラーが出てしまいました。 そこでこれらを使用するのは諦めて、 #define~を使って定数を使用しました。 (上記のようなエラーが出てしまうのは、 C言語の仕様上、文法がおかしいからだと 思います。そもそもC++に関する本に 載ってるtipsだし^^;) #defineを使用するように修正して、コンパイルする際に、 既存のソース上のマクロ定義(#define~)と名前が重複するものが いくつか見つかり、修正に手間がかかりました。 マクロ定義なので、スコープという概念は 適用されないと思うので、既存のソースと新規のソースで マクロ定義がバッティングしないようにする策としては どのようなものがあるでしょうか? 今のところ思いつくものとしては以下です。 ・新規のソースに関するキーワードをプリフィックスとして使用する ・新規のソースの末尾で#undefをする。(これは試してないので有効か  どうか自信がありません。) 他に何か有効な策がありましたら教えてください。 よろしくお願いいたします。

  • 親子関係を持つ自作クラスのDownCast

    .NET2.0ベースのVBです。次のコードをビルドしようとすると、CTypeの部分がエラーとなり、「変換演算子によって、ある型からその派生型に変換することはできません」とメッセージがでます。派生クラスに対して、ある一定の法則でダウンキャストさせたいのですが、なぜ不可能なのでしょうか。また、このようなアプローチは間違っているでしょうか。 Public Class Class1  ' このクラスは別ファイルに定義されており、  ' そのファイルは ReadOnly。  Public foo  Public bar  Public baz End Class Partial Class Class1  ' 継承クラスで実装すると、クラス階層構造がより一層複雑になるので、Partial として実装。  ' ダウンキャスト用にキャスト演算をオーバーロード  Public Shared Narrowing Operator CType(ByVal value As Class1) As Class2   Dim result As New Class2   ' .foo は移さない!   result.bar = value.bar   result.baz = value.baz   Return result  End Operator End Class Public Class Class2 : Inherits Class1  Public hoge End Class

  • XMLからJavaObjectへのバースについて

    XMLで以下のような設定ファイルを作ったとします。 <hoge>  <foo name="foofoo">   <bar name="bar1" />   <bar name="bar2" />  </foo> </hoge> この設定ファイルをJavaObjectにバースする場合、 現状バインディングツールを使用してバースしているのですが、 これではバースを行うクラスと、入れ物となるクラスの2つが必要です。 この状態だと設定ファイルのフォーマット変更時に修正範囲が大きくなりますのであまりよろしくありません。 そこで質問なのですが、 XMLと定義ファイル(dtdファイル)を渡してあげれば、 入れ物となるクラスにデータをバースして入れてくれる ツール・ライブラリ等は存在しないのでしょうか? どなたかご存知の方がいらっしゃいましたらご指導よろしくお願いします。

    • ベストアンサー
    • Java
  • getとpostのメソッドがごっちゃになったようなフォームの結果は、条件によって変わる?変わらない

    getとpostのメソッドがごっちゃになったようなフォームの結果は、条件によって変わる?変わらない 以下のように、getとpostのメソッドがごっちゃになったようなフォームについて質問させてください。 ==================================================================================================== <?php //なお、PHP Version 5.1.6、CentOS4.4です。 /** 以下のように、 form tagで、actionにはクエリーストリングをつけて、でもmethodとしてpostを指定した場合、 */ ?> <form action="/phpinf.php?foo=bar&fuga=hoge" method="post" name="f"> <input type="hidden" name="text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost" value="ddddd" /> <input type="submit" name="submit" value="送信" /> </form> ==================================================================================================== の結果は、 $_GETの中身(全部)は $_GET["foo"] bar $_GET["fuga"] hoge //----------------------------------------------------------- $_POSTの中身(全部)は $_POST["text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost"] ddddd $_POST["submit"] 送信 //----------------------------------------------------------- $_REQUESTの中身(全部) は、 $_REQUEST["foo"] bar $_REQUEST["fuga"] hoge $_REQUEST["text_InsideFormElementWhichDeclaresExpresslyThatMethodIsPost"] ddddd $_REQUEST["submit"] 送信 $_REQUEST["セッションidの文字列"] fdhfdshdsfhhkfdsjfdsjf //----------------------------------------------------------- また、$_SERVER から抜粋すると、 $_SERVER["REQUEST_METHOD"] POST $_SERVER["QUERY_STRING"] foo=bar&fuga=hoge $_SERVER["REQUEST_URI"] /phpinf.php?foo=bar&fuga=hoge //----------------------------------------------------------- となりました。 こういった結果は、 OS,Webサーバ,phpやperlやrubyやasp...などの言語の種類(or 素のhtml)、 また、user agent にも関係なく、 同様の結果となるのでしょうか? さらに質問ですが、こういったformの記述は、RFCやW3Cの規約に反していないのでしょうか? ご存じの方がいらっしゃしまた、お教えいただければ幸いです。 以上、よろしくお願いいたします。