2013-08-30 47 views
3

我正在閱讀Spring in Action,發現類似這樣的東西,任何人都可以解釋我們如何使用RowMapper作爲匿名類,如果它是根據RowMapper文檔的接口。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); 
    } 

回答

5

匿名類new Something() {...}不是Something的實例。相反,它是Something子類/實現。所以,從接口派生匿名類是非常有效的。

0

語法

new SomeInterface() { 
    // Definition for abstract methods 
} 

限定anonymous class。只要接口中指定的所有方法都在大括號內定義,這是實現給定接口的有效類。

請注意,該表達式隱式定義了一個匿名類該類的一個實例。

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; 
      } 
    } 
}