0

Groovyの初心者として...

イベントリスナー、フィルターなどの Java イディオムを置き換えようとしています。

groovy での私の作業コードは次のとおりです。

def find() {
    ODB odb = ODBFactory.open(files.nodupes); // data nucleus object database
    Objects<Prospect> src = odb.getObjects(new QProspect());

    src.each { println it };

    odb.close();

}

class QProspect extends SimpleNativeQuery {
    public boolean match(Prospect p) {
        if (p.url) {
            return p.url.endsWith(".biz");
        }
        return false;
    }
}

これは、ODB.getObjects() メソッド内で Query インターフェースの実装が行われる Java で慣れ親しんだものとはかけ離れています。「Java」をコーディングする場所があれば、おそらく次のようなことをするでしょうが、まだ機能していません。

Objects<Prospect> src = odb.getObjects( {
        boolean match(p) { 
            if (p.url) {
            return p.url.endsWith(".biz");
        }
            return false; 
        }
    } as SimpleNativeQuery);

または、次のようにしたいと思います。

 Objects<Prospect> src = odb.getObjects( 
      { it.url.endsWith(".biz") } as SimpleNativeQuery
 );

ただし、「一致」メソッドを外側のスクリプトコンテキストに関連付けて失敗させるために、Groovyが行うことは何ですか。

私はグルーヴィーだと思います...とにかくグルーヴィーなので、それについてもっと学ぶことに固執します。ありがとう。


私が尋ねるべきだったのは、groovy で「匿名」クラスをどのように行うかということでした。Java のイディオムは次のとおりです。

void defReadAFile() {
    File[] files = new File(".").listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.getPath().endsWith(".biz");
        }
    });
}

追加のクラス宣言なしで groovy を簡潔にできますか?

4

3 に答える 3

1

あなたの本当の質問は、「クロージャーを使用しない Java API を呼び出すときに、匿名クラスの代わりにクロージャーを使用できますか」だと思います。そして、答えは明確な「はい」です。これ:

 Objects<Prospect> src = odb.getObjects( 
      { it.url.endsWith(".biz") } as SimpleNativeQuery
 );

動作するはずです。「しかし、「一致」メソッドを外側のスクリプトコンテキストに関連付けて失敗させるために、グルーヴィーは何をしますか」と書いています。それはどのように正確に失敗しますか?「グルーヴィーな方法」であり、まさにあなたが望んでいるものであるソリューションを得るために、単純な技術的問題を抱えているように思えます。

于 2009-04-17T14:00:11.517 に答える
1

問題を抽象化して、Neodatis DB インターフェースに依存しないようにしておけば、答えを得るのに役立つと思います。使用したことがないので、ループに陥りました。それについて私が以下に書いたことは、非常にざっくりとした分析に基づいています。

さらに言えば、Groovy を使用したことはありませんが、Groovy は気に入っています。しかし、誰もまだ答えていないので、あなたは私に行き詰まっています:-)

問題 (または少なくともその一部) は、Neodatis の SimpleNativeQuery クラスに期待しすぎていることにあると思います。返されたコレクションにオブジェクトを追加する前に、オブジェクトをフィルタリングしようとしているようには見えません。代わりに を使用したいと思いますorg.neodatis.odb.impl.core.query.criteria.CriteriaQuery。(パッケージ パスの「impl」に注意してください。このクラスが呼び出し元によって使用されることを意図しているかどうかはよくわからないので、これには少し不安があります。クエリ条件を指定するため)。

しかし、CriteriaQuery を直接使用する代わりに、クロージャーで使用できるように、Groovy クラス内にラップする方がよいと思います。したがって、クロージャーを使用したコードの Groovy バージョンは次のようになると思います。

// Create a class that wraps CriteriaQuery and allows you 
// to pass closures.  This is wordy too, but at least it's
// reusable.

import org.neodatis.odb.impl.core.query.criteria;

class GroovyCriteriaQuery extends CriteriaQuery {
    private final c;

    QProspect(theClosure) {
         // I prefer to check for null here, instead of in match()
         if (theClosure == null) {
             throw new InvalidArgumentException("theClosure can't be null!");
         }
         c = theClosure;
    }

    public boolean match(AbstractObjectInfo aoi){
        //!! I'm assuming here that 'aoi' can be used as the actual
        //!! object instance (or at least as proxy for it.)
        //!! (You may have to extract the actual object from aoi before calling c.)
        return c(aoi);
    }
}

// Now use the query class in some random code.

 Objects<Prospect> src = odb.getObjects( 
      new GroovyCriteriaQuery(
          { it.url.endsWith(".biz") } 
      )
 )

これが役立つことを願っています!

于 2009-04-17T04:01:37.353 に答える
0

はい、ありがとうございます。

また、SimpleNativeQuery が機能しない理由もわかりました (Dan Breslau による)。

私は次のことを試しましたが、見事に機能しました。したがって、イディオムは期待どおりに機能します。

new File("c:\\temp").listFiles({ it.path.endsWith(".html") } as FileFilter);

この次のものは、neodatis インターフェイスのために機能しません。インターフェイスはmatch() メソッドを強制しません! ドキュメントでのみ言及されていますが、クラスファイルには存在しません。

public class SimpleNativeQuery extends AbstactQuery{

}

Objects<Prospect> src = odb.getObjects( 
  { it.url.endsWith(".biz") } as SimpleNativeQuery
);

上記では、SimpleNativeQuery に match() メソッドがないため、Groovy コンパイラーが SimpleNativeQuery 内のどのメソッドにクロージャーをアタッチする必要があるかを識別することができなくなります。その後、外側の groovy スクリプトがデフォルトになります。

Groovy を使って 3 日目ですが、気に入っています。

どちらの本も素晴らしいです: - Groovy Recipes (Scott Davis) - Programming Groovy (Venkat Subramaniam)

于 2009-04-17T14:13:13.453 に答える