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

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

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

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

Q&A

解決済

4回答

3708閲覧

固定値の持ち方について

kurage

総合スコア18

Java

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

0グッド

0クリップ

投稿2018/10/13 04:26

実現したいこと

保守しやすいようにソースの見直しを行っています。
その中で、赤ならば1、白ならば2、というように、画面表示用の文字列と固定値が紐づいているデータがあります。
このようなデータの参照が複数クラスに散らばっているので、まとめたいと考えています。

発生している問題

Aクラスでは、コンボボックスを作成するために、keyに1、valueに“赤”を設定しています。
Bクラスでは、コンボボックスのkey値を用いて、1ならばXXXを表示、という処理を行っています。
まとめる方法として、以下を実施しました。

1.定数クラスにまとめる
定数クラスを作成し、定数クラス.red = 1としてソースの置き換えを行いました。
問題点として、定数クラス.on = 1というものも定義していて、コーダーが「1」という値だけで判断し、Aクラス、Bクラスで”赤”のkey値を指す定数がばらけてしまいました。
少量であれば問題がないのですが、今後バグにつながるのではと危惧しています。

2.コンボボックス、表示、それぞれのMapを作成する
コンボボックス生成用のクラスにMap<key, value>、表示用のクラスにMap<key, message>を用意して、突合せを行うようにすればよいのかと考えました。
ですがこの場合、key値が変わった場合に2か所直す必要があるので、保守性を高めるという点では良くないのかと思っています。

どのようなまとめ方が最適であるのか、ご教示いただけますと幸いです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

既にswordoneさんからEnumでの解決案も提示されていますので
こんな感じならうまく収まるのではないかというコードを書いてみました。
Enumでも対応できるという、解決案として参考にしていただければ幸いです。

java

1 public static enum ColorCollection { 2 RED(0), 3 BLUE(1); 4 5 private int colorId; 6 7 private static final Map<ColorCollection, String> MESSAGE_MAP = new HashMap<ColorCollection, String>(); 8 9 static { 10 MESSAGE_MAP.put(ColorCollection.RED, "red"); 11 MESSAGE_MAP.put(ColorCollection.BLUE, "blue"); 12 } 13 14 ColorCollection(int colorId) { 15 this.colorId = colorId; 16 } 17 18 public int getColorId() { 19 return this.colorId; 20 } 21 22 public String getMessage() { 23 return MESSAGE_MAP.get(this); 24 } 25 } 26

Enumはクラスのような振る舞いが出来て大体の事は出来てしまうため非常に便利ではあるのですが、
何でもかんでもEnumで・・・という流れにならないようされた方が良いと思います。

コンボボックス生成用のクラスにMap<key, value>、表示用のクラスにMap<key, message>

上記の件ですが、これら(2つのMAP)を1つのクラスに集約しておけば修正軽微でしょうし、コーダーに対してインターフェースによる制限を設ける事が出来ますので、個人的には1クラスに集約して対応される事をおすすめします。

投稿2018/10/13 11:55

編集2018/10/13 11:57
Lazy-player

総合スコア77

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

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

kurage

2018/10/14 06:01

Lazy-playerさん ありがとうございます!わかりやすいサンプルを記載していただいたおかげで、改修方法に目途をつけることができました。 ご提案いただいたように、1クラスでまとめるように進めていくつもりです。 今までEnumの便利さがわからなかったのですが、少しわかった気がします。
guest

0

表示用のラベルも定義するとのことから、
列挙型(enum)で定数値を定義しておき、
表示用文言をプロパティファイルで設定するのがJavaではよく使われる手法です。

投稿2018/10/14 02:17

A-pZ

総合スコア12011

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

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

kurage

2018/10/14 06:09

A-pZさん ご回答ありがとうございます。 今回は要素数がそれほど多くないので、列挙型のみを使用して改修を進めていこうと思います。 Key値の値変更だけでなく、表示用文言の変更についても対応を容易にするのであれば、プロパティファイルで設定するのが一番なのかなとご指摘を受けて思いました。変更要望がありそうなものについては列挙型とプロパティファイルの併用を検討したいと思います。
guest

0

2.だけ。
Mapを作っておき、実行時にコンボボックスにそのMapを設定(あるいはバインド)するようにすれば一箇所だけの修正で済みます
#デザイン時はコンボボックスは空としときます

投稿2018/10/13 05:07

y_waiwai

総合スコア87719

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

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

kurage

2018/10/14 06:21

y_waiwaiさん ご回答ありがとうございます。 プロパティファイルのようなものを実行時に読み込んでMap化し、使用する。という認識で合っていますでしょうか? 今回は列挙型を使う方向でいこうと思っていますが、ご提案いただいた方法ですと、プロパティファイルの修正のみで今後の変更対応が完了しそうなので、修正するものによってはご提案いただいた方法をとらせていただこうと思います。
guest

0

典型的なEnumの使いどころではないでしょうか。

投稿2018/10/13 04:46

swordone

総合スコア20649

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

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

kurage

2018/10/14 06:24

swordoneさん ご回答ありがとうございます。 ご提案いただいたように、列挙型で対応しようと思います。 今までは列挙型を、定数をまとめたようなもの、という誤った認識でいましたが、拡張できることなどを今回学びました。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問