4

典型情况:我们有一些类型为空的列,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 方法中更改外部对象(参考罗伯特马丁的“清洁代码”第 17 章:气味和启发式,函数,F2)。我尽量避免这种情况,但这一次我找不到更好的解决方案。也许有人可以帮我一个?

4

1 回答 1

5

我不认为这特别糟糕,真的。让我们来看看:

  • 它是void,所以它一定有副作用,否则没用
  • 它是静态的,因此它不会对“它被调用的对象”产生任何影响;一个都没有!

因此,副作用要么是全局的(例如,文件系统等外部的,静态变量等内部的,或临时的,例如休眠的),要么会影响参数引用的对象之一。

int不是对象,对象是不可变的Integer,所以它唯一可以影响的是PreparedStatement. 由于准备好的语句的目的之一是收集参数数据,因此该方法这样做似乎是完全合理的。方法名称使这一点更加清晰 - 如果不在准备好的语句上,它还会在哪里“设置”一个 int 或 null?

基本上:别担心:)

可能希望通过将其移至公共“帮助器”类来使这一点更加清晰,例如PreparedStatementHelper- 这使得您可能很明显确实希望这些方法处于启用状态PreparedStatement,但它们并非如此,因此您必须拥有一个静态方法而不是作用于一个PreparedStatement.

一种替代方法是创建自己的包装类,该类将维护一个PreparedStatement自身,并具有一个实例setIntOrNull方法......但从长远来看,我相信这会更加复杂,几乎没有什么好处。

于 2012-06-01T14:55:16.057 回答