2013-03-26 57 views
1

我經常做這樣的東西,而編碼:爲什麼我不能'使用嵌套的類/對象?

getNamedJdbcTemplate().update(sql, new MapSqlParameterSource() { 

     { 
      addValue("a", obj.getA()); 
      addValue("b", obj.getB()); 
      addValue("c", obj.getC()); 
     } 
    }); 

或本

getJdbcOperations().queryForObject(sql, new Object[] { id}, new RowMapper<Obj>(){ 

     @Override 
     public Obj mapRow(ResultSet rs, int rowNum) throws SQLException { 
      // TODO Auto-generated method stub 
      return null; 
     }}); 

我也用了不少關內的類與Java方法。

當然,如果我使用的代碼多一次,我會把它放在一個不同的類,所以我可以重用它...問題是,我的團隊夥伴不喜歡這個,沒有人能夠給我爲什麼不...

他們談論了很多關於內存泄漏和垃圾收集(GC),但我相信這些都是過去的東西。 我使用Java6和Spring 3.這些應用程序部署在Tomcat 6服務器上。

+0

http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization值得一讀,雖然大多數的答案是從2009年,所以可能使用Java 6. – andyb 2013-03-26 09:10:21

+0

這不是彈簧相關的。 – Ralph 2013-03-26 09:28:42

+0

你可以使用雙括號初始化,但你可能不會。 – Xaerxess 2013-03-26 09:35:11

回答

1

只是有幾個缺點,我可以考慮使用雙括號初始化基本上任何匿名類一般:

  1. 多一點點的內存消耗 - 你寫的每new A() { }實質上是創建時間A的新匿名子類必須由類加載器加載並因此消耗一些內存。但我會說,儘管這對於一些內存消耗非常重要的應用程序來說可能很重要,但對於絕大多數程序(特別是服務器端程序)來說,Java類的內存開銷非常小,我甚至不會考慮它。

  2. 創建匿名子類會給依賴反射的許多框架和庫帶來意想不到的麻煩。如果它不指望子類的存在,它也可能跳過equals()方法。例如,想想實例new A() { int x = y; }可以被序列化和反序列化嗎?是new A() {{ a = 7; }}等於new A() {{ a = 7; }}(假設他們的類別分別爲5澳元和9澳元)。第四。

但除此之外,我沒有看到這樣做的任何其他缺點。這兩個提到的問題僅在某些情況下出現,並且可以在需要時輕鬆解決或解決。

在一般情況下,我更喜歡匿名類的一次性使用,我也做雙重大括號初始化很多,因爲它使代碼更好,更結構化,更易於閱讀。

P.S.我的一些同事也對我大喊:D

+1

關於Spring 3 - 我不認爲Spring 3特有的任何其他問題,除了Spring特別反思的那些,因爲Spring使用反射很多。但正如我上面提到的,我從來沒有見過或沒有聽說過任何關於匿名接口實現的問題(例如'new RowMapper(){}',我只有一些基於反射的比較和序列化問題,但它不是Spring本身,但其他第三方庫。 – wajda 2013-03-26 09:40:26

相關問題