あるパラメータが特定の数値でない場合のみ、処理を分けたいと思っています。
通常であればif文の中で条件を書くのですが、今回の場合は「特定の数値」が数多くあるうえ、mainの処理内でこの条件分岐を行う箇所が多いので、
定数の管理とそれに付随するメソッドを持つ新しいクラスを作り、if (isSafe) {...}
のように書くことができればと思っています。
public class ValidationUtil {
public static class SafeNum {
//管理すべき定数(実際は20個ほどある)
public static final int NUM_A = 1234;
public static final int NUM_B = 5678;
}
public static boolean isSafe(int testNum) {
if (testNum == SafeNum.NUM_A || testNum == safeNum.NUM_B) {
return true;
}
else {
return false;
}
}
}
上記のように定数クラスとメソッドという形で切り出してみたのですが、これだと結局if文の中に条件を書き足すことになり、定数を追加するときに手間がかかります。
なにか良い書き方はあるでしょうか?あるいは、このような場合は定数クラスを使わない方が書きやすいでしょうか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
定数ならenumにすると追加が簡単にできますよ。
public static void main(String[] args){
System.out.println(SafeNum.isSafe(1234)); // true
System.out.println(SafeNum.isSafe(1235)); // false
}
enum SafeNum {
NUM_A(1234),
NUM_B(5678);
public final int num;
private SafeNum(int num) {
this.num = num;
}
// 定数を追加してもこのメソッドは変更不要
public static boolean isSafe(int value) {
return Arrays.stream(SafeNum.values()).anyMatch(p -> p.num == value);
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Setを使うのはどうでしょう?
Set<Integer> set = new HashSet<>(Arrays.asList(1234, 5678, ...));
set.contains(testNum);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Collectionでもコト足りるような気がします。
インスタンスはほぼ一緒ですが。。。
private static Collection<Integer> c = Arrays.asList(12,123,1234);
public static boolean isSafe(int testNum) {
return c.contains(testNum);
}
書き方というよりは、設計になりますが、
DBやpropertyファイルなどに定数を持たせることで、
ソースを改修せずに挙動を変えることができます。
システム的に利用しているだけであれば、定数クラス(Java)。
業務的に利用しているのであれば、外部ストレージ(DB、ファイル)。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-2
データ(特定の数値)の個数が一定でないのなら、特定の数値の集合(HashSet)を使うのが良いのではないでしょうか。
特定の数値の集合をつくるところは
// int型の値をいれる集合(HashSet)のオブジェクト set を作ります。
Set<int> set = new HashSet<int>();
// set に特定の数値を追加してゆきます。
set.add(1234);
set.add(5678);
// 同じように、特定の数値を全部、集合 set に追加してください
というような感じ。 特定の数値の個数だけ、set.addを行います。
そして、集合 setを使うように修正した isSafeは、
public static boolean isSafe(int testNum) {
for(Iterator it = set.iterator(); it.hasNext(); ) {
if(testNum = it.next()){ // 特定の数値の一つと一致した
return true;
}
// 全部の特定の数値と比較したが、一致しなかった。
return false;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2018/04/15 14:37 編集
Java 8以降の構文も入っていて参考になります。