我正在阅读Spring in Action并发现像这样的人可以解释我们如何使用RowMapper作为Anonymous类,如果它是一个接口,按照RowMapper文档。
public Employee getEmployeeById(long id) {
return jdbcTemplate.queryForObject(
"select id, firstname, lastname, salary " +
"from employee where id=?",
new RowMapper<Employee>() {
public Employee mapRow(ResultSet rs,
int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getLong("id"));
employee.setFirstName(rs.getString("firstname"));
employee.setLastName(rs.getString("lastname"));
employee.setSalary(rs.getBigDecimal("salary"));
return employee;
}
},
id);
}
答案 0 :(得分:5)
匿名类new Something() {...}
不是Something
的实例。相反,它是Something
的子类/实现。因此,从接口派生匿名类是完全有效和有用的。
答案 1 :(得分:1)
Anonymous类不是类的实例,而只是定义类的另一种方式,类似于嵌套类,但由于它的方法相关,所以不太可重用。 因为您可以定义实现接口的类
public A implements B {
}
您可以引用该类的实例,将其声明为接口
B b = new A();
你也可以使用匿名课程。 唯一要做和记住的事情(因为存在编译器)是你必须实现接口本身定义的所有方法。
该解决方案是一种更简洁的方法:
public EmployeeController {
public Employee getEmployeeById(long id) {
return jdbcTemplate.queryForObject(
"select id, firstname, lastname, salary " +
"from employee where id=?",
new CustomRowMapper(),
id);
}
class CustomRowMapper implements RowMapper<Employee>() {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getLong("id"));
employee.setFirstName(rs.getString("firstname"));
employee.setLastName(rs.getString("lastname"));
employee.setSalary(rs.getBigDecimal("salary"));
return employee;
}
}
}
答案 2 :(得分:0)
语法
new SomeInterface() {
// Definition for abstract methods
}
定义anonymous class。只要接口中指定的所有方法都在大括号内定义,这是一个实现给定接口的有效类。
请注意,此表达式隐式地定义了一个匿名类和该类的实例。