【发布时间】:2013-06-28 21:16:58
【问题描述】:
我想知道是否有可能在 Java 中“避免”空检查,以这段代码为例:
@Override
public List<AccountBean> search(AccountConstraint... c) {
if (c.length == 0) {
throw new IllegalArgumentException("dao.AccountDAO.search: c.length == 0");
}
try {
List<AccountBean> beans = new ArrayList<>();
for (AccountConstraint ac : c) {
Builder builder = new QueryBuilder.Builder("SELECT * FROM accounts");
if (ac.getAccountId() != null) {
builder.clause("accountId >= " + ac.getAccountId().getMin() + " AND accountId <= " + ac.getAccountId().getMax());
}
if (ac.getUsername() != null) {
builder.clause("username = \"" + ac.getUsername() + "\"");
}
if (ac.getPassword() != null) {
builder.clause("password = \"" + ac.getPassword() + "\"");
}
if (ac.getEmail() != null) {
builder.clause("email = \"" + ac.getEmail() + "\"");
}
PreparedStatement ps = connection.prepareStatement(builder.build().getQuery());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
beans.add(new AccountBean(rs));
}
}
return beans;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
它必须检查 4 次 != null,否则代码将失败。
如果没有 NullPointerException,是否可以将 if (object != null) 语句转换为 仅 执行的单行语句?当出现异常时,应该忽略该行。
我在这里不是在谈论通用语言功能,我说的是只有在您明确决定这样做时才会上交的功能。
例如:NullCheck(builder.clause("username = \"" + ac.getUsername() + "\"")); 将是建议代码的 sn-p。
在 Java 中可以实现类似的功能吗?
如果不可能的话,Java 8 中是否可以直接在方法中使用方法(voids)?
那么这样的代码真的可以工作吗?
public static NullCheck(Void void) {
try {
void.execute();
}
catch (NullPointerException e) {
//ignore
}
}
我知道我可以将方法放在它自己的类中,该类扩展具有方法 execute() 的接口,然后传递该类,但这会破坏摆脱空检查或任何可能的目的的目的更复杂。
问候。
警告:我在这里使用 PreparedStatement 的方式很容易发生 SQL 注入。不要重复使用此代码。
【问题讨论】:
-
我也想知道这个。我认为没有——如果你看看像 Oozie 这样的大型开源包,它们有一个空类检查或函数。
-
我希望这种方法不用于用户输入(它可能是),因为它是等待发生的巨大 SQL 注入攻击。您应该正确使用 PreparedStatement(使用参数,而不是硬编码值)。
-
@jtahlborn 感谢您的提醒。我确实完全忘记了正确使用它,但是我在插入/删除中正确使用了它,所以只是遗憾地忘记了它。再次感谢。
-
考虑这是否值得。你在感知的优雅中获得了什么,你在清晰中失去了。这看起来很难看的基本原因是单个语句 if 的 { } (这是一个常见的误解,即它们是良好风格所必需的)。没有它,声明就是
if (ac.getEmail() != null) builder.clause("email = \"" + ac.getEmail() + "\"");,它比任何“优雅”的解决方案都简洁易懂。