質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

2回答

4609閲覧

public static final による定数は「型安全で無い」という問題について

former_neet_cat

総合スコア46

Java

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

0グッド

2クリップ

投稿2018/03/13 05:49

どうすれば、エラーの表示なく、コードが作れるか教えて欲しいです。

ある参考書で、emue型を勉強していた時に、public static finalによる定数には「型安全では無い」という問題があります。
と書いてありました。

そこで実際に確かめるためにコードを動かそうとしたのですが、作っている途中でエラーが起こってしまいます。

参考書に書いてあることを簡単に記入していくと...

String型の定数として、次の3つの定義します。

java

1public static final String COLOR_BLUE = "blue"; 2public static final String COLOR_YELLOW = "yellow"; 3public static final String COLOR_RED = "red";

を定義し、processColorメソッドを定義し、
引数にcolorを定義します。

java

1public void processColor(String color){ 2//引数を利用した処理 3}

ここで、processColorメソッドには、COLOR_BLUE,COLOR_YELLO,COLOR_REDのいずれかが渡される想定ですが、コーディングミスをしてしまい、color値としてgreenを渡してしまうかもしれない。
そうすると、想定とは異なる動作となってしまう。
これが、型安全では無いという状態。

また、javaではコンパイルの際に、定数を利用しているクラスの定数(利用クラス)に、定数を定義しているクラス(定数クラス)の定数の値そのものが展開される。

そのため、定数クラス側で定数の値を変更してコンパイルしても、利用クラス側の定数の値は書き換わら無い。
定数クラス側をコンパイルした場合には、利用クラスも一緒にコンパイルする必要がある、

例えば次のように定義すると、

定数クラス側の定義

java

1public static final String SELECTED_COLOR = "blue";

利用クラス側の定義

java

1 public String color = SELECTED_COLOR;

このクラスをコンパイルすると利用クラス側では次のソースと同じ状態になる。

java

1public String color = "blue";

そして、この状態で定義クラス側の定義をSELECTED_COLORredと変更してコンパイルしても、利用クラス側は、blueのままとなってしまう。
利用クラス側も同時にコンパイルすれば値はredに変わる。

発生している問題・エラーメッセージ

Illegal modifier for parameter color; only final is permitted

該当のソースコード

java

1public class Task { 2 3 4 5 public static final String COLOR_BLUE = "blue"; 6 public static final String COLOR_YELLOW = "yellow"; 7 public static final String COLOR_RED = "red"; 8 9 public static final String SELECTED_COLOR = "blue"; 10 public String color = SELECTED_COLOR; 11 12 13 public static void processColor(String color) { 14 15 public String color = SELECTED_COLOR; 16 17 public String color = "blue"; 18 19 } 20 21 22 23 24} 25

試したこと

Illegal modifier for parameter color; only final is permitted

と出ていたので、publicの表記を消して、colorの名前を変えることでエラーは消えたが・・・

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

eclipseを使用。

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

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

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

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

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

guest

回答2

0

ベストアンサー

何がやりたいのか、あまり伝わってこないですが、
とりあえず。コンパイルエラーにならない、想定外の値が設定できるケースの例です。

java

1public class Task { 2 public static final String COLOR_BLUE = "blue"; 3 public static final String COLOR_YELLOW = "yellow"; 4 public static final String COLOR_RED = "red"; 5 6 public static final String SELECTED_COLOR = "blue"; 7 public String color = SELECTED_COLOR; 8 9 public void processColor(String color) { 10 this.color = color; 11 } 12 13 public static void main(String[] args) { 14 Task t = new Task(); 15 t.processColor(Task.COLOR_BLUE); 16 System.out.println(t.color); // blue 17 18 // これが出来てしまうのが困る 19 t.processColor("色と関係ない文字列"); 20 System.out.println(t.color); 21 } 22} 23

投稿2018/03/13 07:58

momon-ga

総合スコア4820

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

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

former_neet_cat

2018/03/13 14:59

わかりやすい解説ありがとうございます! 本当に助かります!!
guest

0

enum以前の問題として、変数のスコープが把握できていないように思われます。

public static void processColor内で、引数とさらにもう2回colorが宣言されているので、名前が衝突しています。

投稿2018/03/13 06:00

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2018/03/13 07:04 編集

衝突の前のエラーの問題(質問の対象)は メソッド変数の修飾子は final のみ許可してます ( public をそんなとこにかけません ) じゃね
former_neet_cat

2018/03/13 14:58

教えていただきありがとうございます。 大変助かりました。 >asahina1979さん、いつもありがとうございます! 本当に助かってます。 早く、まともな質問できるレベルになるまで頑張ります・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問