質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

840閲覧

【Java】定数を定義する意味/使い回し方 が分からない

o46tk

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2024/07/10 20:53

編集2024/07/11 06:09

0

0

実現したいこと

①定数の定義する意味
②使用方法、使用用途
③今回の場合での使用方法
④出力失敗かつエラー出ない場合の(4-1)原因や(4-2)原因特定、(4-3)その対処
を知りたいです…。

4つ全部でなくとも、1つでもいいのでご回答いただけたら大変嬉しいです。。

↓下記に詳細を記載しました。↓

発生している問題・分からないこと

①14行目15行目で行う、定数の定義は何故/何の為にするのか
また、②その使い方はどのような使い方でするのか、③今回においては、何行目のコードで使うのか
以上の3点が基本的には教えていただきたいです。

また、④コードを書き換えてしまって今のコードではならないかもしれませんが、
コンパイルして、実行した際に、
コード内(2)29~32行目「ログイン成功です」の出力だけで、他(3)(4)などが出力されず、コンパイル時にエラーも出ませんでした。
逆に、エラーが出ないと何がダメなのかも特定できず困ってしまったので、もしその状況をイメージできて、今回の原因 もしくは 一般的な対処法を教えていただきたいです。

該当のソースコード

Java

1* 本課題では、すべての定数(合計6種類)を使いつつ、if文の使い方に慣れていきましょう! 2 * 問① 〜 問⑤まで回答お願いします! 3 * 4 */ 5public class Task1_6 { 6 7 // 定数(条件) 8 // ① 名前とパスワードの定数を定義してください。 9 // 補足: 10 // 定数は②〜⑤で使い回すために定義しておきます。 11 // final修飾子を付与すると、変数(動的に変わる値)ではなく、定数(変更不可な定まった値)となります。 12 // 「ここへ記述」部分へ適当な値を記述しましょう。 13 // ※詳しくは××××にて紹介します。 14 private static final String CONST_ALICE = "ここへ記述"; 15 private static final String CONST_PASS = "ここへ記述"; 16 // 定数(メッセージ) 17 private static final String CONST_MSG_SUCCESS = "ログイン成功です。"; 18 private static final String CONST_MSG_ERROR_NAME = "名前に誤りがあります。"; 19 private static final String CONST_MSG_ERROR_PASS = "パスワードに誤りがあります。"; 20 private static final String CONST_MSG_ERROR_INPUT = "入力情報に誤りがあります。"; 21 22 public static void main(String[] args) { 23 24 // 以下の変数「name(名前)」「pass(パスワード)」を使用して、②〜⑤の条件を満たす処理を記述してください。 25 // 名前とパスワードは画面からの入力値だと想定してみましょう。 26 String name = "alice"; 27 String pass = "pass"; 28 29 // ② 名前が「 alice 」、パスワードが「 pass 」であった場合、「 ログイン成功です 」と出力してください。 30 if (name.equals("alice")) { 31 System.out.println(CONST_MSG_SUCCESS); 32 } 33 34 // ③ 名前のみ正しい場合、「 パスワードに誤りがあります。 」と出力してください。 35 if (pass.equals("pass")) { 36 } else if (name.equals("alice")) { 37 38 39 System.out.println(CONST_MSG_ERROR_PASS); 40 } 41 42 43 // ④ パスワードのみ正しい場合、「 名前に誤りがあります。 」と出力してください。 44 if (name.equals("CONST_ALICE")) { 45 } else if (pass.equals("CONST_PASS")) { 46 System.out.println(CONST_MSG_ERROR_NAME); 47 } 48 49 // ⑤ 名前もパスワードも間違っていた場合は、「 入力情報に誤りがあります。 」と出力してください。 50 if (!(name.equals("CONST_ALICE")) && !(pass.equals("CONST_PASS"))){ 51 System.out.println(CONST_MSG_ERROR_INPUT); 52 } 53 } 54} 55

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べ方が分からなかった。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/07/11 00:52

> 調べ方が分からなかった。 おそらく何らかのカリキュラムに沿って学習されているのでしょう。 一般には、学習→学習定着の確認のための練習問題→学習→学習定着の確認のための練習問題→ ・・・ の繰り返しです。これが「学習定着の確認のための練習問題」だとすると、お書きのような疑問が湧いたり、お書きのような間違ったプログラムを書いてしまうと言うことは、その前の「学習」の中味がほとんど理解できていないと言うことで、その状態で「学習定着の確認のための練習問題」に取り組むことは時間の無駄です。時間を有効に使うために、学習内容を十分復習して、理解した上で問題に取り組みましょう。復習時の不明点は指導者に質問しましょう。 質問に対しての、指導者の回答が不審な場合は、このサイトで他の人に聞いてみるのも良いでしょう。 何らかのカリキュラムに沿って学習されているのではなく、「ふと見つけたこの問題をやってみた」のであれば、その学習方法はあなたには合ってないということかと思います。
o46tk

2024/07/11 01:38

コメントありがとうございます。 仰る通りカリキュラムに沿って学習しています。 定数に関しては、(13行目伏字にしていますが)先の単元にあり、未習です。 その単元も確認したのですが、要約すると「役割は変数と同じで、ただ変えないようなものは定数で定義しましょう」程度しか書かれていませんでした。 また、指導者に質問しましたが、毎度漠然とした回答で、 今回に関しては「(要約すると)このプログラムは、何かのサービスにログインするときの処理を想像してください。それを踏まえた上で再度 定義する意味や使い回し方も考えてみましょう」のような回答でした。 他の方の回答を待ちながら、実行されてないコードに関して学習内容も振り返ってみようと思います。
otn

2024/07/11 02:45

ほう。この課題が学んでいないことも含んだ練習課題であるとは思いもしませんでしたが、そういう事情だとしょうがないですね。 > 一般には、学習→学習定着の確認のための練習問題→学習→学習定着の確認のための練習問題→ ・・・ と書きましたが、 「学んでいないことを知らないと解けない課題を与えて、自分で調べて学ぶスキルの向上を図る」 という学習方法もあるので、そういう方針なのであれば、そういうつもりで、調べ学ぶしかないですね。 ただ、変数名・定数名を引用符で囲んでしまうという間違いについては、学習済みの範囲かと思いますが。
guest

回答2

0

ベストアンサー

定数とはなんなのか。

という勉強そのものみたいな問に本当にちゃんと答えるならそれは教科書を写すような答えになりかねず、それなら教科書読んで頂いたほうが早いということになるんですが。

定数は値の変えられない変数です。矛盾していますが、なので変数と呼ばず定数と呼びます。
変えられないというのは、プログラム内で定義時以外で
定数=ほにゃらら;
と書くことが出来ないということです。(コンパイルエラーになります。)

値が変えられない変数(=定数)に何の得があるのか。

定数を定義する主な目的は、値に名前を付けることです。
もしコードを読んでいる時に

if(i > 255) {

という if 文に出会ったら、 255 という値が何を示すのか分かるでしょうか。
もちろん前後の処理とかコメントとかで分かる場合もありますが、

if(i > BYTE_VALUE_MAX) {

だったら「『1バイトで表すことが出来る最大値』を超えたら…ってことは 2 バイト以上必要かみたいな判定かな?」とこの文だけで推測が出来るわけです。
で、実際 BYTE_VALUE_MAX を検索してみたら

/**1バイトで表すことが出来る最大値 */ static final int BYTE_VALUE_MAX = 255;

みたいな定義が見つかったりするわけです。

※なので、本来は定数名は中身の意味を示すものとするのであり、中身そのものにしてはいけません。if(i > VALUE_255) { では全く定数の意味が無いのです。その点で CONST_ALICE という定数(名)は間違っています。

また、定数としておくことで変更をし易くすることにもなります。
データは幾つまで持てるようにするかとかループは最大何回やったら終わりにするとかいう限界値みたいなのはシステムにはよくあります。(上の BYTE_VALUE_MAX もそうですね。)
そしてシステムを作ってからそれらが変更されることもあります。

10 種類のデータを扱うシステムで、当初それぞれ最大 100 件と決まっていたためにアチコチで for(int i=0; i<100; i++) { ~ } とか if(j >= 100) break; とかがあったとします。
やがて 10 種類の内 3 種類で最大件数を 200 件にすることになったとしたら・・・担当することになった(恐らくは開発した当人で無い)プログラマは、システム内にある全ての 100 という数字の中から 3 種類のデータの件数を表しているものを見つけ出して 200 に修正しなければなりません。
もし違う 100 を弄ってしまったら問題でしょうし、抜けがあってもまた問題でしょう。

※ for 文で 100 件をループするのに for(int i=0; i<=99; i++) と書くような人もいます。もし 100 を 200 に直そうとして "100" でコード内を検索していたらこの for 文は見つからず直し抜けとなるでしょう。

一方、 10 種類のデータの最大件数を定数として別々に定義してあり、ちゃんとそれらが使われていたなら

static final int DATA_A_MAX = 100; static final int DATA_B_MAX = 100; //中略 static final int DATA_J_MAX = 100;
for(int i=0; i<DATA_C_MAX; i++) { ~ }
if(j >= DATA_A_MAX) break;

該当する DATA_?_MAX の値を 200 にするだけです。

投稿2024/07/11 06:14

編集2024/07/11 09:48
jimbe

総合スコア13394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

o46tk

2024/07/11 08:30

ご回答ありがとうございます! 定数とはなんなのか、定数を定義する価値 定数の定義NG例、その現場での具体例 それぞれ挙げながら丁寧にご説明いただいて、大変理解に助かりました! ありがとうございます。
guest

0

定数は、System.out.println(CONST_MSG_SUCCESS);のように、引用符に入れずに使います。

"CONST_PASS"と書くと、書いた通りの"CONST_PASS"という文字列としてしか認識されません。

投稿2024/07/10 23:58

maisumakun

総合スコア146758

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/07/10 23:59

現状のコードでは、CONST_PASSやCONST_ALICEを参照する場面が全く無いですので、まずはそれを修正するのがスタートラインです。
o46tk

2024/07/11 01:50

ご回答、ありがとうございます! CONSTの引用符について修正したところ、1つ無事出力されました! ありがとうございます。 ___________________________ 他の出力に関しては、14行目15行目の"ここへ記述"を埋めてから、ということですよね。 ここへは、どういうものを当てはめるのがいいのか見当がついていません。 イメージとしては、 "ここへ記述"の場所に、ユーザーが入力した名前が入力されて、 コード内ではCONST_ALICEとして定めておく、というようなことでしょうか? とすれば、単純に"アリス"とでも問題ないのでしょうか?
jimbe

2024/07/11 05:34

>"ここへ記述"の場所に、ユーザーが入力した名前が入力されて、 >コード内ではCONST_ALICEとして定めておく、というようなことでしょうか? 逆ですね。 「ユーザーが入力した名前」(とパスワード)は 25~27 行目の // 名前とパスワードは画面からの入力値だと想定してみましょう。 String name = "alice"; String pass = "pass"; がそれに当たります。それを 29 行目 // ② 名前が「 alice 」、パスワードが「 pass 」であった場合、「 ログイン成功です 」と出力してください。 のコメントに則って 30 行目に if を書く(ただし name 変数とそれに対応する定数 / pass 変数とそれに対応する定数を用いる) ということです。 まずは定数を用いずに if を書き、それから定数に当たる部分を定数にする…という順でやってみるというテもあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問