2013-03-26 55 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

相关问题