【发布时间】:2023-06-21 11:20:01
【问题描述】:
如何将匿名内部类与构造函数块分开定义?
例如在我的代码中,我希望 method2 与 method1 做同样的事情,唯一的区别是 method2 使用 Factory 类来创建 ClosableResultSet。
import java.sql.*;
public class Demo {
public static void main(String[] args) {
method1();
method2();
}
static void method1() {
Connection conn;
try {
conn = DriverManager.getConnection("jdbc:h2:C:/myDB", "sa", "sa");
String sql = "select * from Customers";
try (ClosableResultSet rs = new ClosableResultSet(conn, sql) {
@Override
public void handleError(SQLException e, String action) {
System.out.print(action + ": " + e.getMessage());
}
}) {
while (rs.next()) {
System.out.print("Name: " + rs.getString("name") + "\n");
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static void method2() {
String sql = "select * from Customers";
//here has the syntax errors
try (ClosableResultSet rs = Factory.createResultSet(sql) {
@Override
public void handleError(SQLException e, String action) {
System.out.print(action + ": " + e.getMessage());
}
}) {
while (rs.next()) {
System.out.print("Name: " + rs.getString("name") + "\n");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.sql.*;
public class Factory {
public static ClosableResultSet createResultSet(String sql) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:h2:C:/myDB", "sa", "sa");
return new ClosableResultSet(conn, sql);
}
}
import java.sql.*;
public class ClosableResultSet implements java.io.Closeable {
private ResultSet rs;
public ClosableResultSet(Connection conn, String sql) throws SQLException {
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}
public Boolean next() {
try {
return rs.next();
} catch (SQLException e) {
handleError(e, "next");
return false;
}
}
public String getString(String columnLabel) {
try {
return rs.getString(columnLabel);
} catch (SQLException e) {
handleError(e, "get " + columnLabel);
return "";
}
}
@Override
public void close() {
try {
rs.close();
} catch (SQLException e) {
handleError(e, "close");
}
}
public void handleError(SQLException e, String action) {
// to be override
}
}
我不想在Factory类中声明匿名内部类,是否有任何lambda表达式允许我将其放入method2中?
【问题讨论】:
标签: java anonymous-inner-class