0

私はSpring JDBCに対応しようとしていますが、これらの匿名クラスを使用しているとバグが発生します。最終的なものでない限り、ローカル変数を渡すことができないため、簡単に配置できますが、配列またはコレクションをループする必要がある場合はどうなりますか? 「FedModel fm」はループ内で再初期化されるため、最終的であると宣言することはできませんが、execute メソッドを 100 回呼び出す必要があります。これは、私が問題を抱えている具体的なシナリオです。BLOB をデータベースに挿入する方法が他にないためです。

 for (int i = 0; i < fedModels.size(); i++) {
        FedModel fm = fedModels.get(i);

        jdbcTemplate.execute("INSERT INTO items (name, video_blob) VALUES (?, ?)",
                  new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
                  protected void setValues(PreparedStatement ps, LobCreator lobCreator) 
                        throws SQLException {
                            ps.setString(1, fm.getName());
                            ps.setString(2, fm.getDifficultyLevel());
                            ps.setString(3, fm.getEquipment());
                            lobCreator.setBlobAsBinaryStream(ps, paramIndex, contentStream, contentLength);                                                     
                          }
                });

} 

私が考えることができる唯一のことは、AbstractLobCreatingPreparedStatementCallback を拡張し、内部でループを実行できるように fedModels のコンストラクターを追加する静的なネストされたクラスを作成することです。ただし、JDBC のみを使用する方が簡単です。

4

1 に答える 1

1

...しかし、これらの匿名クラスを使用していると、最終的なものでない限りローカル変数を渡すことができません...

これはSpringのせいではありません。Java プログラミング言語のプロパティです。

基本的に、Java 言語 (少なくとも Java 6 以前) は、匿名クラス インスタンスがインスタンスを囲むスコープ内のローカル変数にアクセスして更新できるようにするクロージャをサポートしていません。回避策として、この言語では、final. これは、それぞれの変数の値を匿名クラスのインスタンスにコピーし、隠し変数に格納することによって (クロージャーなしで) 実装されます。

fmあなたの特定のケースでは、簡単な解決策はas として宣言することfinalです。匿名クラスのループ変数にアクセスする必要がある場合は、最終コピーを宣言できます。例えば

for (int i = 0; i < 10; i++) {
    final int ii = i;
    new Thread(new Runnable(){
        public void run() {
            System.err.println(ii);
        }
    }).start();
}
于 2010-09-25T02:43:33.447 に答える