Frage

Ich versuche, Spring JDBC gerecht zu werden, aber was nervt mich ist es, diese anonymen Klassen, in denen wir keine lokalen Variablen passieren kann, wenn sie nicht endgültig sind, welche leicht arrangieren könnte, aber was ist, wenn ich Schleife ein brauchen Anordnung oder Sammlung? Ich kann nicht „FedModel fm“ erklären endgültig zu sein, wie es in der Schleife neu initialisiert wird, aber ich muss die Methode execute 100 mal anrufen. Das ist die konkrete Szenario, in dem ich das Problem haben, denn ich kenne keine andere Art und Weise, wie BLOB in eine Datenbank einzufügen.

 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);                                                     
                          }
                });

} 

Das einzige, was ich denken kann, ist die Schaffung einer statischen geschachtelten Klasse, die AbstractLobCreatingPreparedStatementCallback erweitert und fügt Konstruktor für fedModels so, dass ich die Schleife innen tun könnte. Aber es wäre einfacher, nur JDBC verwenden.

War es hilfreich?

Lösung

... aber was nervt mich ist diese anonymen Klassen, in denen wir keine lokalen Variablen passieren kann, es sei denn sie sind endgültig ...

Dies ist nicht Frühling Schuld. Es ist Eigentum der Java-Programmiersprache.

Grundsätzlich ist die Java-Sprache (mindestens Java 6 und früher) nicht unterstützt Verschlüsse , die die anonyme Klasse Instanz Zugriff erlauben würde, und lokale Variablen in der einschließenden Bereiche der Instanz aktualisieren. Zur Umgehung des Problems können die Sprache, die Sie Zugriff auf lokale Variablen einschließt, die final sind. Dies wird implementiert (ohne Verschlüsse) durch Kopieren der entsprechenden Variablenwerte in die anonyme Klasseninstanz, und sie in verborgenen Variablen zu speichern.

In Ihrem speziellen Fall, die einfache Lösung ist fm als final zu erklären. Wenn Sie benötigen, um die Schleifenvariable in der anonymen Klasse zuzugreifen, können Sie eine endgültige Kopie zu erklären; z.

for (int i = 0; i < 10; i++) {
    final int ii = i;
    new Thread(new Runnable(){
        public void run() {
            System.err.println(ii);
        }
    }).start();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top