为什么我不能'使用嵌套类/对象?

时间:2013-03-26 08:58:48

标签: java

我经常在编码时做这样的事情:

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方法大量使用Inner类。

当然,如果我更多地使用代码,那么我将把它放在另一个类上,这样我就可以重复使用了...问题是我的队友不喜欢这个,没有人能够给我正当理由为什么不......

他们谈论了很多关于内存泄漏和垃圾收集(GC)的内容,但我相信这些都是过去的内容。 我正在使用Java6和Spring 3.应用程序部署在Tomcat 6服务器上。

1 个答案:

答案 0 :(得分:1)

我可以考虑使用双支撑初始化以及基本上任何匿名类的一些缺点:

  1. 更多内存消耗 - 每次编写new A() { }时,你基本上都会创建一个新的匿名子类A,它必须由类加载器加载,因此会消耗一些内存。但我要说的是,虽然这对于某些内存消耗至关重要的应用程序很重要,但对于绝大多数程序(尤其是服务器端程序)而言,Java类内存开销非常小,我甚至不考虑它

  2. 创建匿名子类可能会导致许多依赖于反射的框架和库出现意外问题。如果它不期望存在子类,它也可能会使equals()方法跳闸。例如,想一想如何序列化和反序列化实例new A() { int x = y; }new A() {{ a = 7; }}是否等于new A() {{ a = 7; }}(假设他们的等级分别为A $ 5和A $ 9)。第四。

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

    一般来说,我也更喜欢一次性使用匿名类,我也做了很多双括号初始化,因为它使代码更好,更结构化,更容易阅读。

    P.S。我的一些同事也在吼叫我:D