Интересно, если это будет возможно «избегать» нулевых проверок в 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
, потому что иначе код потерпит неудачу.
Возможно ли преобразовать операторы if (object != null)
в однострочные, чтобы только выполнить, если нет NullPointerException? Когда есть исключение, эту строку следует просто игнорировать.
Я не говорю об общей функции языка здесь, я говорю об одной функции, которая была бы включена, когда вы решительно решите это сделать.
Например: NullCheck(builder.clause("username = \"" + ac.getUsername() + "\""));
был бы фрагментом предложенного кода.
Возможно ли это на Java?
Также, если это невозможно, возможно ли в Java 8 использовать методы (пустоты) непосредственно в методах?
Итак, код, подобный этому, может действительно работать?
public static NullCheck(Void void) {
try {
void.execute();
}
catch (NullPointerException e) {
//ignore
}
}
Я знаю, что я мог бы поставить метод внутри его собственный класс, который расширяет интерфейс, который имеет метод execute()
, а затем передать этот класс вокруг, но это поражение цели, чтобы избавиться от пустых чеков или ничего, что бы быть еще более сложным.
С уважением.
ВНИМАНИЕ: способ, которым я использовал PreparedStatement, в данном случае подвержен SQL-инъекции. Не используйте этот код повторно.
Я также задавался об этом. Я не думаю, что есть ... если вы посмотрите на большие пакеты с открытым исходным кодом, такие как Oozie, у них есть проверка или функция нулевого класса. – jmpyle771
Надеюсь, что этот метод не используется для ввода пользователем (что, вероятно, есть), потому что это гигантская инъекция SQL-инъекций, ожидающая своего появления. вы должны правильно использовать PreparedStatement (используя параметры, а не жестко закодированные значения). – jtahlborn
@jtahlborn Спасибо за головы. Я действительно полностью забыл использовать его правильно, однако я использовал его правильно при вставке/удалении, так что это просто вопрос о том, чтобы забыть его с грустью. Еще раз спасибо. – skiwi