Правильно ли присвоить переменную, используя && с той же переменной в Java? - PullRequest
3 голосов
/ 07 октября 2019

Я делаю некоторые изменения в старом коде, которые требуют обслуживания, и я нашел что-то вроде этого

public boolean aMethod(){
    boolean isValid = true;

    **isValid = isValid &&** executeGetDocs(id.toString(),program().toString(), document.get(name));

  return isValid;
}

Метод executeGetDocs может возвращать true или false.

Но я не уверен, что: ** isValid = isValid && executeGetDocs ** является правильным или просто избыточным.

Итак, я могу, кто-нибудь, пожалуйста, дайте мне какое-нибудь объяснение по этому поводу?

Большое спасибо!

РЕДАКТИРОВАНИЕ

Весь метод:

private boolean validateDocs(List<Map<String, Object>> documentsList) {
        boolean isValid = true;
        StringBuilder gradoAntComp = new StringBuilder();
        for (Map<String, Object> document : documentsList) {
            String id = document.get("ID_DOC").toString();
            if (id.equalsIgnoreCase("25")) {
                isValid = getData(id.toString(),program().toString(), document.get(name))
            } else if (id.equalsIgnoreCase("26") ) {
                isValid = isValid && getDocs(id.toString(),program().toString(), document.get(name));
            } 
        }
        return isValid;
    }

Ответы [ 3 ]

3 голосов
/ 07 октября 2019

Не то, чтобы мы видели весь ваш метод, мы можем видеть, что вы пытаетесь присвоить isValid в цикле. Написанный таким образом, код использует оператор условного оператора && и выполняет только метод getDocs, если isValid все еще true.

Если предыдущее присвоение isValid устанавливает егона false, тогда getDocs даже не будет вызван;это будет короткое замыкание. Это означает, что оператор && уже знает, что результатом выражения будет false, потому что isValid равно false, поэтому он «замыкает» вычисление и не оценивает другой операнд -вызов getDocs.

Это имеет большой смысл, особенно если getDocs - это метод с большими накладными расходами.

2 голосов
/ 07 октября 2019

Это было излишним в вашем первоначальном вопросе. Исходный метод, который вы опубликовали, может быть уменьшен до:

public boolean aMethod() {
    return executeGetDocs(id.toString(),program().toString(), document.get(name));
}

с (true && x) == x для любого boolean x.

Однако, поскольку вы изменили вопрос, ответ изменится наЧто ж. Теперь переменная boolean может меняться несколько раз в цикле. Поэтому имеет смысл использовать И предыдущее значение переменной (которое может быть true или false) с другим boolean, что может привести к изменению ее значения.

private boolean validateDocs(List<Map<String, Object>> documentsList) {
    boolean isValid = true;
    StringBuilder gradoAntComp = new StringBuilder();
    for (Map<String, Object> document : documentsList) {
        String id = document.get("ID_DOC").toString();
        if (id.equalsIgnoreCase("25")) {
            // this can set isValid to either false or true
            isValid = getData(id.toString(),program().toString(), document.get(name))
        } else if (id.equalsIgnoreCase("26") ) {
            // therefore performing logical AND between the previous value of
            // isValid and some additional boolean is meaningful - isValid will
            // be assigned true only if it was true before this statement AND
            // getDocs(id.toString(),program().toString(), document.get(name)) is true
            isValid = isValid && getDocs(id.toString(),program().toString(), document.get(name));
        } 
    }
    return isValid;
}
1 голос
/ 07 октября 2019

Когда вы инициализируете isValid как true, это бесполезно, вы можете переписать его как:

public boolean aMethod(){
    return executeGetDocs(id.toString(),program().toString(), document.get(name));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...