4

典型的な状況: 型を持つ null 許容列がIntegerあり、それが両方nullまたは何らかのint値である可能性があります。そこで、以下を使用します。

private static void setIntOrNull(PreparedStatement stmt, int col, Integer i)
    throws SQLException
    {
        if (i == null)
            stmt.setNull(col, java.sql.Types.INTEGER);
        else
            stmt.setInt(col, i);
    }

しかし、私にとって、このケースは一種の悪い習慣です。内部の void メソッド内で外部オブジェクトを変更することです ( Robert Martin の「Clean Code」第 17 章: Smells and Heuristics, Functions, F2 を参照)。私はそのような状況を回避しようとしますが、今回はより良い解決策を見つけることができませんでした. 多分誰かが私を助けてくれるでしょうか?

4

1 に答える 1

5

特に悪いとは思いません、本当に。どれどれ:

  • voidですから、副作用があるか、役に立たないに違いありません
  • これは静的であるため、「呼び出されたオブジェクト」に影響を与えることはできません。1つもありません!

そのため、副作用はグローバルなもの(ファイルシステムなどの外部、静的変数などの内部、またはスリープなどの一時的なもの)になる、パラメーターによって参照されるオブジェクトの1つに影響します。

intオブジェクトではなく、オブジェクトInteger不変であるため、影響を受ける可能性があるのは. プリペアド ステートメントの目的の 1 つはパラメーター データを収集することであるため、メソッドがそのようにすることは完全に合理的と思われます。メソッド名はこれをさらに明確にします - 準備されたステートメントでない場合、他にどこで int または null を「設定」するのでしょうか?PreparedStatement

基本的に:心配しないでください:)

のようなパブリックな「ヘルパー」クラスに移動することで、これをさらに明確にしたい場合があります。に作用する代わりに静的メソッド。PreparedStatementHelperPreparedStatementPreparedStatement

1 つの選択肢は、それ自体を維持し、インスタンスメソッドを持つ独自のラッパークラスを作成することです。PreparedStatementsetIntOrNull

于 2012-06-01T14:55:16.057 に答える