如何独立于构造函数块定义匿名内部类?
例如,在我的代码中,我希望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中?
答案 0 :(得分:0)
是的,您可以执行以下操作:
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, (e, 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, final ErrorHandller errorHandller) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:h2:C:/myDB", "sa", "sa");
return new ClosableResultSet(conn, sql) {
@Override
public void handleError(SQLException e, String action) {
errorHandller.handleError(e, action);
}
};
}
interface ErrorHandller {
void handleError(SQLException e, String action);
}
}
...
如您所见,已添加新界面ErrorHandller
。 Factory::createResultSet
现在也接收ErrorHandller
的实例作为第二个参数。
然后在Demo::method2
中,将lambda传递为Factory.createResultSet
方法的第二个参数。
答案 1 :(得分:0)
您可以创建另一个Factory
之外的BiConsumer
方法。像这样:
String sql
然后您的import java.sql.*;
import java.util.function.BiConsumer;
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);
}
public static ClosableResultSet createResultSet(String sql, BiConsumer<SQLException, String> handler) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:h2:C:/myDB", "sa", "sa");
return new ClosableResultSet(conn, sql) {
@Override
public void handleError(SQLException e, String action) {
handler.accept(e, action);
}
};
}
}
应该是:
method2