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を1つに組み合わせる以外に:

if(statement1 && statement2 && statement3)

頭に浮かんだいくつかの他のアイデアがあります:

importsPreparedStatementを一度だけ真にする必要がある場合は、break;に設定した後にできますtruetrueそのため、フィールドを使用するように設定した後、検索する意味がなくなった場合break;

設計の観点からは、をor 、または Maybeifのようなメソッドに組み合わせることができます。doesImportPreparedStatementisImportingPreparedStatementcontainsImportPreparedStatement

もう1つ見えます。あなたはあなたを繰り返して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 + 2後でj + 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

&&演算子を使用して 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 と評価された場合。他の 2 つは単に必要ではないため、評価されません。

于 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 に答える