我需要这样做,检查java.sql.PreparedStatement的导入,我有解析树,包含该列表上的import语句,我想检查它,代码alredy工作,但它看起来像是不是最好的,是否有更好的方法来查看此列表?
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;
}
}
}
}
答案 0 :(得分:2)
除了将3个ifs组合成一个:
if(statement1 && statement2 && statement3)
还有一些其他想法可以想到:
如果importsPreparedStatement
只需要为真,那么您可以在break;
设置为true
之后true
。因此,如果在将字段设置为break;
后使用if
,则无法再进行搜索。
从设计角度来看,您可以将doesImportPreparedStatement
组合成isImportingPreparedStatement
或containsImportPreparedStatement
或packageDefinition
之类的方法。
我还有一件事。您正在迭代for (int j = 0; j < packageDefinition.size() - 2; j += 3)
,但是您正在检查3个元素。我假设它们被分组为3组,所以你可以这样做:
for(DefinitionElement e : packageDefinitions) {
if(e.doesImportPreparedStatement()) {
importsPreparedStatement = true;
break;
}
}
从设计的角度来看如果我是你,我会将这3个元素放入他们自己的类中,在这种情况下,你可以简化事情,它看起来像:
DefinitionElement
在后一种情况下,类型j + 2
将包含您在数组中组合在一起的3个元素,以及一个可以判断它是否包含预准备语句导入的方法。我认为这种形式更易读,更易于维护。根据我使用索引计算的经验并不好玩,您必须了解上下文才能知道j + 2
的含义。
如果您不希望(或不能)将它们移动到自己的类中,您至少可以为索引j + 1
和{{1}}命名,以便稍后知道它们是什么意思。
答案 1 :(得分: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;
}
}
答案 2 :(得分: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的&&
运算符执行 short-circuit 。
例如,当(packageDefinition.get(j).getText().equals("java"))
评估为false时。其他两个不会仅仅因为没有必要进行评估。
答案 3 :(得分:-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"};