2010-10-12 2 views
3

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

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

Это то, что у меня есть, я хочу поместить elseif вместо else и сделать другое внутри, чтобы установить нулевое значение, что означает не выше, а затем я хочу вернуть логическое значение. местного билд-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; 
    } 
} 

ответ

5

Есть два способа, которыми вы можете это сделать.

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

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

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

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; 
} 
+0

извините, поскольку вы можете сказать, что я новичок в java, это то, что у меня есть до сих пор. – OakvilleWork

+0

public class MailerType { private boolean isOldMailer (File mailerFolder) { Файл localBuildAndDeploy = новый файл (mailerFolder, "test/local-build-deploy.cmd"); if (localBuildAndDeploy.exists()) { return true; } else if { return false; {else } } } – OakvilleWork

+0

Я обновил это, чтобы работать с кодом, который у вас есть. Вам просто нужно будет заполнить ваши точные условия для каждого значения. –

1

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

Boolean - это двоичный код, конечно - просто верно или false.

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

-1

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

+0

Shamik - каждый разработчик ожидает, что логическое значение будет либо истинным, либо ложным. Даже язык, с его автоматическим распаковкой, предполагает это. Очень жаль, что нуль - технически возможная ценность. Я бы никогда не использовал это как _expected_ поведение в публичном API. – extraneon

+0

Я согласен, что это уродливый способ сделать это. – Shamik

1

(Я рассмотрю три общих варианта, а затем предложите третий).

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

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

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

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

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

Третий - и рекомендовал - вариант заключается в использовать дополнительный < Boolean> от Google's excellent Guava library:

  1. Это очень распространенная библиотека.
  2. Это самодокументирующее.
  3. У этого есть well-defined semantics.
  4. Null не является проблемой.
  5. Булева семантика всего лишь получить.
  6. Преобразование в/из нулевой модели в первом варианте, выше, является veryconcise и легко читаемым.
Смежные вопросы