используя логический объект - PullRequest
3 голосов
/ 12 октября 2010

У меня проблемы с попыткой получить желаемый результат. По сути, я хочу иметь объект Boolean, который позволит мне иметь 3 варианта, если почтовый ящик старый, я хочу, чтобы он был установлен в значение false (то есть не содержит «mapQ.cmd» и «add-coid.cmd». "файл)

если почтовик новый, я хочу, чтобы он был установлен в true (если он новый, он будет содержать файл «mapQ.cmd» и «add-coid.cmd» в каталоге), и если он не старый или новый почтовик (имеется в виду не почтовик), тогда я хочу, чтобы он был нулевым.

Это то, что у меня есть, я хочу поместить elseif вместо else и сделать внутри него else, чтобы установить нулевое значение, означающее не указанное выше, тогда я хочу вернуть логическое значение. local-build-deploy.cmd используется в примере, но я хочу использовать вышеупомянутые имена файлов

private boolean isOldMailer(File mailerFolder) {
    File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd");
    if (localBuildAndDeploy.exists()) {
        return true;
    } else {
        return false;
    }
}

Ответы [ 4 ]

6 голосов
/ 12 октября 2010

Это можно сделать двумя способами.

Если вы настаиваете на использовании логического значения, используйте заглавную версию B вместо строчной буквы b.Capital B Boolean - это объект, для которого можно установить значение null и выполнять то, что вы описываете.Нижний регистр b логический является примитивом и не может быть установлен в нуль.

Однако есть лучший способ, который не полагается на использование логического значения для 3 значений, если он рассчитан на 2.

Используя enum, вы можете определить ваши типы так, как вы хотите, и иметь ровно столько, сколько вам нужно.Вот пример и как вы бы его использовали.

public enum Status { NEW, OLD, NEITHER }

private Status isOldMailer(File mailerFolder) {
    File localBuildAndDeploy = new File(mailerFolder,"test/local-build-deploy.cmd");
    if (localBuildAndDeploy.exists())
        return Status.NEW;
    else if (/*Something else*/)
        return Status.OLD
    else
        return Status.NEITHER;
}
1 голос
/ 26 сентября 2012

(я перейду к трем общим вариантам и предложу третий).

Первый вариант - использовать логическое значение и установить для него значение true, false илипустой .Это имеет несколько преимуществ:

  1. Предполагая, что вы сначала проверите, чтобы убедиться, что значение не равно нулю, вы можете использовать его непосредственно в логических выражениях.
  2. Это довольно спорный момент, но нульна самом деле не слишком далеко от «ни одного из возможных значений» ( т.е. ни истина, ни ложь), так что это разумная модель. Многие не согласны .
  3. Кратко.

Однако некоторые люди, разумно или нет, ожидают, что логическое значение будет либо истинным, либо ложным, и не рассматриваютнулевая возможность, которая может легко привести к ошибкам .

Второй вариант - использовать перечисление :

  1. Нет реального рисканеправильное использование, поскольку null не является опцией, но ...
  2. Вы теряете логическую семантику .
  3. В зависимости от того, что вы моделируете, оно может или не может бытьбыть эстетическим , чтобы ввести пользовательское перечисление.

Третий - и рекомендуемый - вариант - использовать опциональный из Отличная библиотека Google на языке гуавы :

  1. Это очень распространенная библиотека.
  2. Самодокументируемая.
  3. Она имеет четко определенную семантику .
  4. Ноль не является проблемой.
  5. Булева семантика всего лишь get away.
  6. Преобразование в /из нулевой моделив первом варианте выше очень краткий и легкий для чтения.
1 голос
/ 12 октября 2010

Это троичная логика, а не двоичная логика. Обычно используется в реляционных базах данных.

Булево двоичное, конечно, просто true или false.

Если вы хотите троичную логику, оберните ее в свой собственный тип.

0 голосов
/ 12 октября 2010

Use Boolean - объект-обёртка для примитивного логического значения.Таким образом, вы можете установить для ссылки значение null, true или false.

...