【问题标题】:Substitutions in variable name in javajava中变量名的替换
【发布时间】:2022-01-11 18:03:15
【问题描述】:

不确定这在 JAVA 中是否可行,也不知道它叫什么,所以我不确定要查找什么,但如果可以的话,我真的想在我的逻辑中实现相同的功能。我知道我们可以替换值,但是我不确定如何替换变量。

public interface Constants {
 GENDER_${MALE} = "where Gender = 'MALE' ";
 GENDER_${FEMALE} = "where Gender = 'FEMALE' ";
}

public class Impl {
  System.out.println(Constants.GENDER_MALE);
}

Expected O/P : where Gender = 'MALE';

我只是不想使用 if else 条件,如果 Male 然后返回男性特定的 where 子句 else female.. 因为在实际代码中几乎有 30-35 个 if else 条件,如果可能的话,只想减少它。

【问题讨论】:

  • 在 Java 中不可能(像这样),因为 java 是一种静态编译的语言,并且没有办法拥有像这样执行“动态”的接口。您可以考虑定义一个实现接口的枚举,该接口返回您的 where 子句。
  • 如果您正在构建 SQL 查询,您可能应该使用 JPA 库,而不是硬编码的 sql 过滤字符串
  • 不仅在 Java 中不可能,而且我什至看不到在现实生活中这样做的好处。您的变量名称不应根据其值而变化,也不应延迟命名变量直到设置值。在我看来,这对于常量来说甚至是不切实际的。使用您的示例,将变量命名为 GENDER 有什么问题?
  • 由于这似乎是关于构建 SQL 语句,您应该了解PreparedStatementHow does a PreparedStatement avoid or prevent SQL injection?
  • @ʀᴀʜɪʟ 这点更像是:反射应该永远是你最后的手段。只有在没有其他有意义的方式来实现您需要的东西时,您才会使用它。建议 Java 新手考虑反射时要非常小心。

标签: java if-statement variables substitution


【解决方案1】:

您可以将 where 表达式放在 Map 中,其中 key 是您的变量可能值,例如:

HashMap<String, String> whereMap = new HashMap<>();

whereMap.put("MALE",   "where Gender = 'MALE' ");
whereMap.put("FEMALE", "where Gender = 'FEMALE' ");

并且通过键值检索而不是使用条件进行替换:

String varr = "MALE";
System.out.println(MessageFormat.format("SELECT * FROM EMP {0}", whereMap.get(varr)));

【讨论】:

  • MessageFormat 在这里是一个奇怪的选择。您应该使用 String.format。
【解决方案2】:

不可能这个词不是为我定义的。

方法 1

制作这样的课程,

class Constants {
    public String MALE = "where Gender = 'MALE' ";
    public String FEMALE = "where Gender = 'FEMALE' ";

    public static String GENDER_(String $argument){
        Constants constants = new Constants();
        try {
            Field field = constants.getClass().getField($argument);
            return (String) field.get($GENDER);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

那就这样用吧,

String $GENDER;  // This is your argument, either take it from the user.
System.out.println(Constants.GENDER_($GENDER));

这将完全符合您的要求。是的,我们在这里没有使用任何逻辑(if-else)。

注意:如果参数不是 Constants 中的字段,Constants.GENDER_($GENDER) 将返回 null

方法 2

使用Map 而不是创建字段。像这样,

Map<String,String> fields = new HashMap<>();
fields.put("MALE","where Gender = 'MALE'");
fields.put("FEMALE","where Gender = 'FEMALE'");

然后像这样使用那个地图,

String $GENDER; // Your argument.
System.out.println(fields.get($GENDER));

【讨论】:

  • 我的要求是,我不想使用 if else .. 表示 if (g=="MALE") { System.out.println(Constants.GENDER_MALE);否则 { System.out.println(Constants.GENDER_FEMALE); }...我在想一些事情,Constants.GENDER_$GENDER
  • @Kalpesh 哦,现在我得到了你想要的。我已经编辑了我的答案。
【解决方案3】:
public enum Gender {
    FEMALE, MALE;
    public String where() {
        return "where Gender = '" + this + "' ";
    }
}

String s = Gender.MALE.where();

因为这可能是对大规模建模的尝试:

public static <T extends Enum<T>> String where(T value) {
     return "where Gender = '" + value + "' ";
}

不要对这一切期望太多。

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2020-10-04
    • 2015-01-30
    相关资源
    最近更新 更多