Mutable boolean field в Java

Мне нужно переменное логическое поле в Java (я верну это поле через метод get * позже, и это должно быть возможно изменить это поле).

Boolean не работает, потому что в булевом классе нет установленных * методов (я бы сказал, что логическое значение неизменное, вы можете изменить ссылку только, но вы не можете изменить сам объект).

Я предполагаю, что могу использовать Boolean массив размера 1. Но, вероятно, есть более элегантные решения?

Почему Java не имеет такой простой вещи?

Ответ 1

Неизменяемые классы легче работать. Они никогда не изменятся и проблем с параллельным кодом не возникнет. (В принципе, есть меньше возможностей их разбить.)

Если вы хотите вернуть ссылку на ваше логическое значение, вы можете использовать java.util.concurrent.atomic.AtomicBoolean, если вы работаете с несколькими потоками или обычным старым org.apache.commons.lang.mutable.MutableBoolean.

Ответ 2

Возможно, напишите себе класс-оболочку

class BooleanHolder {
    public boolean value;
}

Или создайте общий класс держателей (это означает, что вам придется использовать класс Boolean вместо примитива Boolean):

class Holder<T> {
    public T value;
}

Затем вы возвращаете класс-оболочку вместо самого значения, что позволяет изменять значение внутри обертки.

Ответ 3

Если вы используете Java 5 или выше, используйте AtomicBoolean

Ответ 4

Почему бы не использовать булевский примитив?

например.

private boolean myFlag = false;

public void setMyFlag(boolean flag) {
   myFlag = flag;
}

Обратите внимание, что ваш метод getter может возвращать Boolean, если требуется, из-за магии autoboxing. Это позволяет легко взаимозаменяемость между использованием примитивов и их эквивалентами объектов (например, boolean vs. Boolean или int vs. Integer).

Итак, чтобы обратиться к вашим отредактированным ответам re. доступные методы,

public Object getAttribute(String attributeName)

может быть реализовано путем возврата autoboxed boolean,.

Ответ 5

Как насчет только использования логического примитива?

private boolean value;

public void setValue(boolean value) {
    this.value = value;
}

public boolean getValue() {
    return value;
}

Ответ 6

Вы можете использовать логический массив

final boolean[] values = { false };
values[0] = true;

Ответ 7

Ответ, который мне больше всего понравился, был от Адама, чтобы написать собственный класс-оболочку... OK

/* Boolean to be passed as reference parameter */
public class Bool {

     private boolean value;

     public Bool() {
         this.value = false;
     }

     public boolean is() {
         return this.value;
     }

     public void setTrue() {
         this.value = true;
     }

     public void setFalse() {
         this.value = false;
     }
 }

Ответ 8

Если вы используете Android, вы можете использовать объекты android.util.Mutable *, которые обертывают различные примитивные значения. Например, цитирование из источника SDK:

public final class MutableBoolean {
  public boolean value;

  public MutableBoolean(boolean value) {
      this.value = value;
  }
}

Ответ 9

Вы действительно говорите, что хотите, чтобы вызывающие абоненты могли изменять логическое значение объекта, манипулируя тем, что возвращается? Чтобы объект и вызывающий пользователь могли поделиться ссылкой на него?

Именно поэтому я понимаю, учитывая:

class OddClass {
   private Boolean strangeFlag;
   public Object getAttrbiute(String attributeName) { 
      if (attributeName.equals("strangeflag")) return (Object)strangeFlag; 
      ...
   }
}

А затем вызывающий абонент:

   Boolean manipulableFlag = (Boolean) myOddClass.getAttrbiute ("strangeflag");

И затем, если вызывающий абонент изменит значение manipulableFlag, вы хотите, чтобы это изменение произошло в экземпляре OddClass, как если бы вызывающий вместо этого использовал метод setAttrbiute.

Это то, о чем вы спрашиваете?

В этом случае вам понадобится класс держателя, как было предложено Адамом.