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 服务器上。

4

1 回答 1

1

我可以考虑使用双括号初始化和基本上任何匿名类通常有几个缺点:

  1. 更多的内存消耗 - 每次你写new A() { }你基本上创建一个新的匿名子类 A 必须由类加载器加载,因此会消耗一些内存。但是我想说,尽管这对于某些内存消耗至关重要的应用程序可能很重要,但对于绝大多数程序(尤其是服务器端程序)来说,Java 类的内存开销是如此之小,以至于我什至不会考虑它.

  2. 创建匿名子类可能会给许多依赖反射的框架和库带来意想不到的麻烦。equals()如果它不期望存在子类,它也可能会触发该方法。例如考虑如何对实例new A() { int x = y; }进行序列化和反序列化?Isnew A() {{ a = 7; }}等于new A() {{ a = 7; }}(假设他们的课程分别是 A$5 和 A$9)。所以第四。

但除此之外,我没有看到这样做的任何其他缺点。提到的两个问题仅在某些情况下出现,并且可以在需要时轻松修复或解决。

一般来说,我也更喜欢一次性使用匿名类,而且我也经常使用双括号初始化,因为它使代码变得更好、更有条理并且更容易阅读。

PS我的一些同事也对我大喊大叫:D

于 2013-03-26T09:27:00.613 回答