RowMapper如何成为匿名类

时间:2013-08-30 13:23:18

标签: java spring

我正在阅读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);
    }

3 个答案:

答案 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。只要接口中指定的所有方法都在大括号内定义,这是一个实现给定接口的有效类。

请注意,此表达式隐式地定义了一个匿名类该类的实例。