4

我需要这样做,检查 java.sql.PreparedStatement 的导入,我有包含该列表上的导入语句的解析树,我想检查它,代码已经有效,但看起来它不是最好的可能是,有没有更好的方法来检查这个列表?

List<DetailAST> packageDefinition = findAllAstsOfType(aAST, TokenTypes.IDENT);
        for (int j = 0; j < packageDefinition.size() - 2; j++) {
            if (packageDefinition.get(j).getText().equals("java")) {
                if (packageDefinition.get(j + 1).getText().equals("sql")) {
                    if (packageDefinition.get(j + 2).getText().equals("PreparedStatement")) {
                        importsPreparedStatement = true;
                    }
                }
            }
        }
4

4 回答 4

2

除了将您的 3 个 if 合二为一之外:

if(statement1 && statement2 && statement3)

想到了一些其他的想法:

如果importsPreparedStatementonly 必须为 true 一次,那么您可以break;在将其设置为true. 因此,如果在将字段设置为trueuse后不再进行搜索break;

从设计的角度来看,您可以将您if的 s 组合成一个方法,例如doesImportPreparedStatementor isImportingPreparedStatement,或者也许containsImportPreparedStatement

我还看到一件事。您正在迭代您的packageDefinition,但您正在检查 3 个元素。我假设它们以 3 组为一组,因此您可以执行以下操作:

for (int j = 0; j < packageDefinition.size() - 2; j += 3)

从设计的角度来看,如果我是你,我会将这 3 个元素放入它们自己的类中,在这种情况下,你可以简化事情,它看起来像:

for(DefinitionElement e : packageDefinitions) {
    if(e.doesImportPreparedStatement()) {
        importsPreparedStatement = true;
        break;
    }
}

在后一种情况下,该类型DefinitionElement将包含您在数组中组合在一起的 3 个元素以及一个可以判断它是否包含准备好的语句导入的方法。我认为这种形式更具可读性和更易于维护。根据我的经验,使用索引进行计算并不好玩,您必须了解上下文才能知道什么j + 2意思。

如果您不想(或不能)将它们移动到自己的类中,您至少可以为索引命名j + 2j + 1这样您以后就会知道它们的含义。

于 2013-04-30T11:50:25.427 回答
2

我不太了解您的DetailAST课程以及您如何将不同的对象插入列表中,但至少您可以使用&&而不是嵌套if语句。

List<DetailAST> packageDefinition = findAllAstsOfType(aAST, TokenTypes.IDENT);
for (int j = 0; j < packageDefinition.size() - 2; j++) {
    if (packageDefinition.get(j).getText().equals("java") &&
        packageDefinition.get(j + 1).getText().equals("sql") &&
        packageDefinition.get(j + 2).getText().equals("PreparedStatement")) {
        importsPreparedStatement = true;
        break;
    }
}
于 2013-04-30T11:50:31.657 回答
1

使用&&运算符将​​其作为一个条件。喜欢 :

if ((packageDefinition.get(j).getText().equals("java"))    && 
    (packageDefinition.get(j + 1).getText().equals("sql")) &&
    (packageDefinition.get(j + 2).getText().equals("PreparedStatement"))) 
{
     importsPreparedStatement = true;
}

因为 Java 的&&操作符会短路

例如,当(packageDefinition.get(j).getText().equals("java"))评估为假时。其他两个不会仅仅因为没有必要而被评估。

于 2013-04-30T11:53:22.720 回答
-1

你可以试试这个解决方案,它会在一个更大的数组中找到一个数组:

public static int findArray(Integer[] array, Integer[] subArray)
{
    if (Collections.indexOfSubList(Arrays.asList(array), Arrays.asList(subArray)) != null)
    {
        importsPreparedStatement = true;
    {
}

只做subArray[] = {"java,"sql",PreparedStatement"};

于 2013-04-30T11:50:41.063 回答