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; }をシリアライズおよびデシリアライズする方法を考えてみてください。はnew A() {{ a = 7; }}等しいnew A() {{ a = 7; }}(クラスがそれぞれ A$5 と A$9 であると仮定)。そして4番目。

しかし、それ以外に、それを行うことの他の欠点は見当たりません。上記の問題はどちらも特定の状況でのみ発生し、必要に応じて簡単に修正または回避できます。

一般的に、私は 1 回限りの使用のために無名クラスを好みます。また、コードをより良く、構造化し、読みやすくするため、二重括弧の初期化も頻繁に行います。

PS 私の同僚の何人かも私に怒鳴っています :D

于 2013-03-26T09:27:00.613 に答える