[英]Java anonymous inner class declaration
如何獨立於構造函數塊定義匿名內部類?
例如,在我的代碼中,我希望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中?
是的,您可以執行以下操作:
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
方法的第二個參數。
除了String sql
之外,您還可以創建另一個采用BiConsumer
Factory
方法。 像這樣:
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
應該是:
static void method2() {
String sql = "select * from Customers";
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) {
e.printStackTrace();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.