RikuMoto
@RikuMoto (Riku Moto)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java if文の冗長化をなくしたい

解決したいこと

if文の条件式と処理の冗長化をなくしたいです。

発生している問題・エラー

String item = request.getParameter("items");   //1,2,3,4のどれかが入る
String sort = request.getParameter("sort");    //asc,descのどれかが入る
String sql = "select * from huga";
if(sort == null){
	;
}else if (sort.equals("asc")){
	sort = "asc";
	if(item.equals("1")){
		item = "hoge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("2")){
		item = "noge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("3")){
		item = "muge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("4")){
		item = "mage";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else{
		;
	}
}else if(sort.equals("desc")){
	sort = "desc";
	if(item.equals("1")){
		item = "hoge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("2")){
		item = "noge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("3")){
		item = "muge";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else if(item.equals("4")){
		item = "mage";
		sql = sql + " " + "order by" + " " + item + " " + sort;
	}else{
		;
	}
}else{
	;
}

ResultSet result = state.executeQuery(sql);
0

3Answer

三項演算子を使うのはいかが?

String item = request.getParameter("items");   //1,2,3,4のどれかが入る
String sort = request.getParameter("sort");    //asc,descのどれかが入る
String sql = "select * from huga";

if (item != null && sort != null) {
    item = item.equals("1") ? "hoge"
         : item.equals("2") ? "noge"
         : item.equals("3") ? "muge"
         : item.equals("4") ? "mage"
         : null;
    if (item != null && (sort.equals("asc") || sort.equals("desc"))) {
        sql += " order by " + item + " " + sort;
    }
}

ResultSet result = state.executeQuery(sql);

新しいJavaならswitchを使うのはいかが?

String item = request.getParameter("items");   //1,2,3,4のどれかが入る
String sort = request.getParameter("sort");    //asc,descのどれかが入る
String sql = "select * from huga";

if (item != null && sort != null) {
    item = switch (item) {
        case "1" -> "hoge";
        case "2" -> "noge";
        case "3" -> "muge";
        case "4" -> "mage";
        default -> null;
    };
    if (item != null) {
        switch (sort) {
            case "asc", "desc" -> sql += " order by " + item + " " + sort;
        }
    }
}

ResultSet result = state.executeQuery(sql);
2Like

Comments

  1. @RikuMoto

    Questioner

    返答ありがとうございます!

    こちらそのままコピペすると
    構文エラーがおきます。

    ```java
    String item = request.getParameter("items"); //1,2,3,4のどれかが入る
    String sort = request.getParameter("sort"); //asc,descのどれかが入る
    String sql = "select * from huga";

    if (sort != null && item != null) {
    item = switch (item) { // = トークン "=" に構文エラーがあります。正しくは : です
    case "1" -> "hoge"; //構文エラーがあります。":" を挿入して SwitchLabel を完了してください
    case "2" -> "noge"; //構文エラーがあります。":" を挿入して SwitchLabel を完了してください
    case "3" -> "muge"; //構文エラーがあります。":" を挿入して SwitchLabel を完了してください
    case "4" -> "mage"; //構文エラーがあります。":" を挿入して SwitchLabel を完了してください
    default -> null;
    };
    if (item != null) {
    switch (sort) {
    case "asc", "desc" -> sql += " order by " + item + " " + sort; //トークンに構文エラーがあります。代わりに TypeElidedFormalParameter を指定する必要があります
    }
    }
    }

    ResultSet result = state.executeQuery(sql);
    ```
  2. 新しいJavaの仕様なので、新しいJDKを使う必要があります。
  3. @RikuMoto

    Questioner

    新しいJDKを使わずの実装なのですみません、、
    条件の記載が不十分で申し訳ございません。
  4. JDKのバージョンはいくつですか?
    古いバージョンでも動作するコードを追記しました。
  5. @RikuMoto

    Questioner

    うわーーー!!
    できました!!!ほんとにありがとうございます!!!
    ちなみにJDKのバージョンは1.8.0_202でした。

Mapを使う方法もあります。

String item = request.getParameter("items");   //1,2,3,4のどれかが入る
String sort = request.getParameter("sort");    //asc,descのどれかが入る
String sql = "select * from huga";
// ソートのパラメータ検証用のList
List sortKeys = new ArrayList<String>(){ 
        {
            add("asc");
            add("desc");
        }
    };
// ソート対象の検証、変換用のMap
Map orderItemMap = new HashMap<String, String>(){
        {
            put("1", "hoge");
            put("2", "noge");
            put("3", "muge");
            put("4", "mage");
                
        }
    };
if(sortKeys.contains(sort) && orderItemMap.containsKey(item)) {
    sql += " order by " + orderItemMap.get(item) + " " + sort;
}
ResultSet result = state.executeQuery(sql);
2Like

質問とは関係ありませんが、

sql + " " + "order by" + " " + item + " " + sort

のようにリクエストパラメータを文字列結合して SQL を作るのは SQL インジェクション攻撃に対して脆弱になるのでやってはいけません。 SQL インジェクションについての簡単な説明と対策については次の記事が参考になると思います。

1Like

Comments

  1. @RikuMoto

    Questioner

    ありがとうございます!

    私にとって難しい記事なのでじっくり考えてみたいと思います!

Your answer might help someone💌