Java:在运行时检查变量类型的最佳方法是什么?

时间:2017-02-20 05:29:20

标签: java

我想知道在运行时检查变量类型的最佳方法。

public Iterator<?> read(String entityName, String propertyName, Object propertyValue) {

    String query = "select * from " + entityName + " where " + propertyName + "=";

    try {
        int value = Integer.parseInt((String)propertyValue);
        query=query+value;
    } catch (NumberFormatException e) {
        // failed
    }

    try {
        String value = (String)propertyValue;
        query=query+"'"+value+"'";
    } catch (ClassCastException e) {
        // failed
    }

    try {
        float value = Float.parseFloat((String)propertyValue);
        query=query+value;
    } catch (NumberFormatException e) {
        // failed
    }

    //Creating JDBC connection and execute query

    Iterator<Element> result=queryConn.execute();

    return result;
}

我需要在运行时检查变量类型是int,float还是String。还有其他最好的办法吗?

或者我是否需要为每个变量类型编写单独的方法?

4 个答案:

答案 0 :(得分:4)

试试这段代码:

if(floatVariable instanceof Float){}
if(intVariable instanceof Integer){}
if(stringVariable instanceof String){}

答案 1 :(得分:1)

  

还有其他最好的办法吗?

我建议您在实际查询中命名要选择的列。如果采用这种方法,则可以将每个列解析为适当的类型,而不必担心类型转换问题。例如,如果选择的第一列是整数类型,那么您只需调用Integer.parseInt()而不必担心类型错误。

这是一个争论,为什么使用SELECT *是一种反模式:

如果您使用SELECT *作为查询,那么我们甚至不知道要返回的列数。为了对此进行猜测,我们必须分析您的代码似乎期望的列数。但是,如果有人要更改架构会发生什么,从而可能会改变RDBMS返回列的顺序?然后您的整个应用程序逻辑可能必须更改。

答案 2 :(得分:1)

有很多方法可以处理这种情况。

  • 对不同数据类型使用函数重载
  • 使用instanceof运算符确定数据类型
  • 尝试在任何数值数据类型中强制转换属性值,如果成功执行castes,则忽略单引号,否则应用单引号

答案 3 :(得分:1)

因为您将对象作为输入,所以您始终可以使用 instanceof 关键字进行检查。而不是使用原语尝试使用类似(Integer.class)的类。还有一件事是你应该使用 PreparedStatement always.Your代码容易出现 SqlInjection